单片机题目:上下车两按钮接入 INT0、INT1,并用数码管显示车上人数(一次中断+1人或-1人)p1.0, p1.1, p1.2 位选端,p0段选端,数码管共阴极接法。
首先,需要初始化IO口,其中P0口作为段选输出,P1口作为位选输出,P3.2和P3.3作为INT0和INT1输入。
#include uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};sbit digit1 = P1^0;
sbit digit2 = P1^1;
sbit digit3 = P1^2;sbit segA = P0^0;
sbit segB = P0^1;
sbit segC = P0^2;
sbit segD = P0^3;
sbit segE = P0^4;
sbit segF = P0^5;
sbit segG = P0^6;
sbit segDP = P0^7;sbit upButton = P3^2;
sbit downButton = P3^3;void init() {P1 = 0x00; // P1口作为位选输出,初始值为0P0 = 0xff; // P0口作为段选输出,初始值为1P3 = 0xff; // P3口作为输入,初始值为1
}
中断服务程序。每当上车按钮按下时,会触发INT0中断;每当下车按钮按下时,会触发INT1中断。在中断服务程序中,需要将人数加1或减1,并更新数码管的显示。
unsigned char count = 0; // 初始人数为0void interrupt0() interrupt 0 { // INT0中断服务程序count++; // 人数加1
}void interrupt1() interrupt 2 { // INT1中断服务程序count--; // 人数减1
}
编写显示程序。将人数的绝对值分解为个位、十位和百位,然后依次在数码管上显示。
void display() {unsigned char absCount = (count >= 0) ? count : -count; // 计算人数的绝对值unsigned char hundreds = absCount / 100; // 计算百位数字unsigned char tens = (absCount % 100) / 10; // 计算十位数字unsigned char ones = absCount % 10; // 计算个位数字// 显示百位数字digit1 = 1; // 第一位不亮digit2 = 1; // 第二位不亮digit3 = 0; // 第三位亮P0 = tab[hundreds];// 显示十位数字digit1 = 1; // 第一位不亮digit2 = 0; // 第二位亮digit3 = 1; // 第三位不亮P0 = tab[tens];// 显示个位数字digit1 = 0; // 第一位亮digit2 = 1; // 第二位不亮digit3 = 1; // 第三位不亮P0 = tab[ones];//延时for(int i=10000;i>0;i--);
}
编写主函数中,需要将中断服务程序和显示程序绑定到相应的中断向量上,并开启中断:
void main() {init(); // 初始化IO口EA = 1; // 允许中断EX0 = 1; // 允许INT0中断EX1 = 1; // 允许INT1中断while (1) {display(); // 显示人数}
}
//当上车按钮或下车按钮按下时,会触发相应的中断,中断服务程序会更新人数,并在下一个循环周期中显示在数码管上。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
