//***********103111231******************//
//***********2007-9-18 *********************//
//***********ICCAVRV6.31A编译***************//
//***********AVR数码管显示程序的运行过程*****// 傻瓜式注释方式想看不懂都难了,适合初学C和AVR的兄弟们,这个简单箭头标注方法是我在把AVR的程序改成C51在KEIL仿真运行时发觉的.其实初学C者最想理解的是程序的单步执行过程,当然这种方法因人而已个人觉得比较不错的,尤其是哪些从硬件转变学软件的新手们,呵呵因为我就是. 电路硬件描述CPU AVRAT90S8538 PB0分两支路,一路经上拉电租10K接5VPB0另一路经S1按键接地; PB1分两支路,一路经上拉电租10K接5VPB1另一路经S2按键接地; PA口从PA0~PA7分别接数码管的A~DP七段字形码 PC口PC0~PC3分别接四位数码管的四位位码C0~C3 数码管采用共阳数码管 每按S1为加1计数,每按S2减1计数,数码管从0000~9999显示数值 本程序采用独创性的简单标注方式,使程序理解更简单方便初学者理解程序 表式程序跳入,→表示程序跳出,↓表示执行下一行程序 ←↓表示程序跳入并继续执行下一行程序, →↓表示程序跳到目标程序运行完后再回到跳出地点 继续执行下一行. include <io8535v.h> #define uchar unsigned char #define uint unsigned int //数码管字型表,对应0,1,2,3,4,5,6,7,8,9// uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar Data[4]={0,0,0,0}; //显示初始值:0 0 0 0 uint CNT=0; //CNT初始计数值:0 uchar Key_Up; //加计数按键标志 uchar Key_Down; //减计数按键标志 //******************************主函数**************************// void main(void) //(1) ↓ 程序从主函数开始 {uchar I; //(2) ↓ 变量I定义无浮号字符型数据8位 Init_IO(); //(3) → 初始化I/O口程序跳到Init_IO()函数 PORTA=0xff; //(4) ←↓IO程序初始化后回到主函数, PORTC=0x00; //(5) ↓ 点亮测试所有的数码管 DelayMs(3000); //(6) → 延时 PORTC=0xff; //(7)←↓ 程序从延时函数完后跳入,并往下执行,数码管 // 灭,进入计数状态 while(1) // 主程序永远循环 {Get_Key(); // (8) → 按键扫描 if(Key_Up==1) // (9) ←↓ 加计数处理 {if(CNT!=9999) // 条件判断是否计数到9999 {CNT=CNT+1; // 计数值加1 Key_Up=0;} // 加计数标志复位 } if(Key_Down==1) //( 10)↓ 减计数处理 {if(CNT!=0) // 条件判断是否计数到0000 {CNT=CNT-1;// 计数值减一 Key_Down=0;}// 减计数标志复位 } Process(CNT,Data); //(11) →跳到计数值处理函数 Display(Data); //(12) ← ↓ 动态扫描显示 } } 傻瓜式注释方式想看不懂都难了,适合初学C和AVR的兄弟们 //因**内容限度只写出主函数,看全部请到www.bbs.zhejiangdz.com
相关链接:http://www.bbs.zhejiangdz.com |