内容发布更新时间 : 2024/12/24 3:51:56星期一 下面是文章的全部内容请认真阅读。
页眉内容
(1);名称 :流水灯
;描述 : ;先从上至下点亮所有的LED,再逐个点亮单个LED
;***********************************************************/ #include \#define uchar unsigned char #define uint unsigned int
uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //存放点亮单个LED的代码 void DelayMS(uint s) //延时子函数,约延时1ms {
uint i; for(s;s>0;s--) for(i=0;i<500;i++); }
void init(void) //stm8初始化函数 { PB_DDR = 0xff; PB_CR1 = 0xff; // 将PB设置成推挽输出 PB_CR2 = 0x00; CLK_SWR = 0xE1; //选内部高速时钟作为主时钟 CLK_CKDIVR = 0x08; //将CPU主频设置为2M(STM8默认的就是内部高速时钟的八分频,即2MH,这里只是告诉大家设置方法) }
void main() { uchar i; init(); while (1) //无限循环 { PB_ODR = 0xff; //先将所有的LED关闭 for(i=0;i<9;i++) //一开始是所有的LED熄灭,再逐点亮所有LED,共九种状态 { DelayMS(500); //延时500毫秒 PB_ODR<<=1; //将PB_ODR向左移动一位,逐渐点亮所有LED } for(i=0;i<8;i++) { PB_ODR=table[i]; //将table中的数依次赋给PB_ODR ,从上至下依次点亮LED DelayMS(500); } } }
中断向量:
/* BASIC INTERRUPT VECTOR TABLE FOR STM8 devices * Copyright (c) 2007 STMicroelectronics */
typedef void @far (*interrupt_handler_t)(void); struct interrupt_vector { unsigned char interrupt_instruction;
页眉内容
interrupt_handler_t interrupt_handler; };
@far @interrupt void NonHandledInterrupt (void) { /* in order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction */ return; }
extern void _stext(); /* startup routine */ struct interrupt_vector const _vectab[] = { {0x82, (interrupt_handler_t)_stext}, /* reset */ {0x82, NonHandledInterrupt}, /* trap */ {0x82, NonHandledInterrupt}, /* irq0 */ {0x82, NonHandledInterrupt}, /* irq1 */ {0x82, NonHandledInterrupt}, /* irq2 */ {0x82, NonHandledInterrupt}, /* irq3 */ {0x82, NonHandledInterrupt}, /* irq4 */ {0x82, NonHandledInterrupt}, /* irq5 */ {0x82, NonHandledInterrupt}, /* irq6 */ {0x82, NonHandledInterrupt}, /* irq7 */ {0x82, NonHandledInterrupt}, /* irq8 */ {0x82, NonHandledInterrupt}, /* irq9 */ {0x82, NonHandledInterrupt}, /* irq10 */ {0x82, NonHandledInterrupt}, /* irq11 */ {0x82, NonHandledInterrupt}, /* irq12 */ {0x82, NonHandledInterrupt}, /* irq13 */ {0x82, NonHandledInterrupt}, /* irq14 */ {0x82, NonHandledInterrupt}, /* irq15 */ {0x82, NonHandledInterrupt}, /* irq16 */ {0x82, NonHandledInterrupt}, /* irq17 */ {0x82, NonHandledInterrupt}, /* irq18 */ {0x82, NonHandledInterrupt}, /* irq19 */ {0x82, NonHandledInterrupt}, /* irq20 */ {0x82, NonHandledInterrupt}, /* irq21 */ {0x82, NonHandledInterrupt}, /* irq22 */ {0x82, NonHandledInterrupt}, /* irq23 */ {0x82, NonHandledInterrupt}, /* irq24 */ {0x82, NonHandledInterrupt}, /* irq25 */ {0x82, NonHandledInterrupt}, /* irq26 */ {0x82, NonHandledInterrupt}, /* irq27 */ {0x82, NonHandledInterrupt}, /* irq28 */ {0x82, NonHandledInterrupt}, /* irq29 */ }; (2):
矩阵键盘、数码管:
;描述 : 按下相应按键显示0到F中对应的数
;***********************************************************/ #include
table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
页眉内容
uchar num;
void delay(uchar a) { uchar i; for(a;a>0;a--) for(i=0;i<255;i++); }
void init(void) { PB_DDR=0XFF;
PB_CR1=0XFF; // 将PB设置成推挽输出 PC_DDR=0X1F;
PC_CR1=0XFF; // 将PC设置成推挽输出 PE_DDR=0x26;
PE_CR1=0XFF; //将PE5,PE2,PE1为推挽输出,其他的设为上拉输入 PD_DDR=0X80;
PD_CR1=0X80; //将PD7设为推挽输出 } /***这里的设置比LED的和数码管的设置要复杂,开始引入输入 模式,矩阵键盘列为输出,行为输入,请参考协会开发板原理图及STM8转51PDF资料***/ /***扫描方式也可为行输出,列输入,读者可以自己尝试着修改***/
uchar keys(void) //此子函数看起来很长,实则只有前面一截内容,下面的“同理可得” { uchar temp; PE_ODR=0X26; //将列中的PD7置为低电平,列中的其他三个置为高电平 PD_ODR=0x00; delay(40); //这里要说明一下,由于矩阵键盘第一列和AD键盘共用一个IO口 //AD键盘的RC会影响IO口电平变化的时间,这里需要延时一段时间,让电容C放电完毕 if((PE_IDR&0x40)==0) //如果第一列的第四行按键被按下,则进入if语句内 {
delay(5); //延时一段时间,等待IO口电平稳定,即消抖 if((PE_IDR&0x40)==0) //再次判断按键是否被按下,避免干扰 {
num=12; //如果第一列的第四行按键被按下,则令num=12,即数码管显示 为C while((PE_IDR&0x40)==0); //如果按键没有松开,则等待 } } temp=PC_IDR&0xe0; if(temp!=0xe0) { delay(5); temp=PC_IDR&0xe0; if(temp!=0xe0) { switch(temp) { case 0xc0:num=0; //如果temp的值为0xc0,则说明第1个按键被按下,下面的依次类推 break;