程序初使化N判断时加键thour是否按下,P1.2=0?判断标志flag是否为0,flag=0?输出时钟时个位加1,dat1[6]++,延时.YYdat1[6]>9?N判断分加键盘tminute是否按下,P1.1=0?NNY输出闹钟时个位加1,alarms[6]++,延时alarms[6]>9?输出时钟时十位加1,dat1[7]++,延时Y判断标志flag是否为0,flag=0?YN输出闹钟时十位加1,alarms[7]++,延时输出闹钟分个位加1,alarms[3]++,延时NNYNdat1[7]>2?Y输出时钟分个位加1,dat1[3]++,延时.alarms[3]>9?NYdat1[3]>9?输出闹钟分十位加1,alarms[4]++,延时Nalarms[4]>2?Yalarms[7]>2?时十位归零,dat1[7]=0Y时十位归零,alarms[7]=0.输出时钟分十位加1,dat1[4]++,延时Ndat1[4]>2?Y分十位归零,dat1[4]=0Y分十位归零,alarms[4]=0.
图3-4按键程序流程图 图3-5为进入中断和清零图,程序中通过扫描来判断按键是否按下进行执行相应的中断来事实现相应的功能。
24
判断分加键tminute是否按下,p1.1=0 N 判断秒表miaobiao1是否按下 N 判断清零键miaobiao2是否按下,p1.3=0 Y Y 进入秒表中断,执行秒表中断程序 返回上级主程序 N 清零所有的计数器,各个显示的字码
图3-5 中断和清零程序流程图 25
§3.3控制电路的C语言源程序
根据流程图,经过认真分析得出控制电路的源程序如下: #include
#define uchar unsigned char #define uint unsigned int #define delay_time 3/*宏定义*/ uchar k,dat[]={0,0,0,0,0,0,0,0}; uint tcount,t,u;
uchar dat1[]={0,0,0,0,0,0,2,1}; uchar dat2[]={0,0,0,0,0,0,0,0}; uchar alarms[]={0,0,0,0,0,0,0,0}; uchar
dis_bit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char code SEG7[11]={0xC0,/*0*/
0xF9,/*1*/ 0xA4,/*2*/
0xB0,/*3*/ 0x99,/*4*/
0x92,/*5*/ 0x82,/*6*/ 0x90,/*9*/ 0xBF,/*-*/ };/*数字显示数组*/ sbit miaobiao1=P1^0; sbit tminute=P1^1; sbit thour=P1^2; sbit miaobiao2=P1^3;
26
0xF8,/*7*/ 0x80,/*8*/
sbit alarm=P1^4; sbit P0_0=P0^0; sbit P1_5=P1^5; sbit P1_6=P1^6;
sbit P1_7=P1^7;/*端口定义*/ uchar ms=0; uchar flag=0; uchar sec=0; uchar minit=0; struct
time{uchar
second;uchar
hour;}time1; uchar n,i; void delay(n) {while(n--)
{
for(i=120;i>0;i--); } }
/*延时子程序*/ void modify(void) { EA=0; if(thour==0) {
if(flag==0) {
dat1[6]++;delay(280);
minute;uchar
27
if(dat1[6]>9)
{ dat1[6]=0; dat1[7]++; } else if((dat1[7]>1)&&(dat1[6]>3)) {dat1[7]=0; dat1[6]=0; } }
if(flag==1) {
alarms[6]++;delay(300);
if(alarms[6]>9) {
alarms[6]=0;alarms[7]++;
if(alarms[7]>2) { alarms[7]=0;
} }
dat[6]=alarms[6];
dat[7]=alarms[7]; }
}
if(tminute==0) {
if(flag==0) {
28