- #include "led_seg.h"
-
-
- u8 SEG_TAB[22]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff,0xbf}; //段码数组0-9共10位, 0-9带小数点共10位,不显示一位
- u8 COM_TAB[8]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE}; //0-7 位码数值
- u8 SHOW_TAB[8]={0,0,0,0,0,0,0,0}; //数码管显示的一个数值
- u8 bdata LED_DATA=0x00; //led显示的一个数值,初始值全部熄灭,bdata修饰的为寻址变量,LED_DATA就可以用sbit来定义LED_DATA的每一位了。
-
- sbit LED0=LED_DATA^0; //bdata修饰的为寻址变量,LED_DATA就可以用sbit来定义LED_DATA的每一位了。
- sbit LED1=LED_DATA^1;
- sbit LED2=LED_DATA^2;
- sbit LED3=LED_DATA^3;
- sbit LED4=LED_DATA^4;
- sbit LED5=LED_DATA^5;
- sbit LED6=LED_DATA^6;
- sbit LED7=LED_DATA^7;
-
-
- //==============================================
- // 函数名称:SEG_LED_refresh
- // 函数功能:led和数码管刷新
- // 入口参数:
- // 函数返回:
- // 备注介绍:前八秒刷新seg,第九秒刷新led,第十秒空,这样led和seg可以同时亮了
- //==============================================
- void SEG_LED_refresh(void){
-
- static u8 num = 0; //静态变量,第一次运行到才会进行初始化,不会释放内存。
-
- if(num<=7){ //0-7数码管刷新
- LED_POW =2; //关闭LED电源
- SEG_COM=COM_TAB[num]; //位码的选择
- SEG_SEG=SEG_TAB[SHOW_TAB[num]]; //数码管上展示数字,两个变量的嵌套
- }
- else if (num<=8){ //LED在第八毫秒刷新
- LED_POW =0; //开启LED电源
- SEG_COM=0xff; //关闭所有数码管
- SEG_SEG=LED_DATA; //LED显示状态
- }else{
- LED_POW =1; //关闭LED电源
- SEG_COM=0xff; //关闭所有数码管
- SEG_SEG=0xff; //关闭所有段码信号
- }
-
-
- num++;
- if (num>10)num=0;
- }
-
-
-
-
-
-
-
-
-
-
-
-
复制代码
在和冲哥的视频学习,stc32G实验箱9.4,第十六集io中断的P35端口,按下按键,数码管会增加1,找不到问题出在哪,按键按了数码管无反应。
希望各位大佬能帮忙看看。- #include "COMM/src/stc.h"
- #include "COMM/src/usb.h"
- #include "led_seg.h"
- #include "key.h"
- #include "beef.h"
- #include "time0.h"
- #include "exit.h"
-
-
- #define MAIN_Fosc 24000000UL //定义一个IRC系统时钟
-
- char *USER_DEVICEDESC = NULL;
- char *USER_PRODUCTDESC = NULL;
- char *USER_STCISPCMD = "@STCISP#";
-
- bit TIME_10ms_flag; //10ms的标识位
-
- void sys_init();
- void delay_ms(u16 ms);
- void Timer0_Isr(void) ;
- void INT0_Isr(void);
- void P3exit_Isr(void);
-
- //数码管对应段展示0-9 16进制
-
- int main ()
- {
- sys_init(); //usb功能+io口初始化
- usb_init(); //usb库初始化
- Timer0_Init();
- P3exit_into();
- EA = 1; //CPU中断打开
-
- LED=0XFF;
- while(1)
- {
-
- }
- }
-
- void P3exit_Isr(void) interrupt 40
- {
- u8 intf; //定义一个变量,接收端口中断标识寄存器的值
- intf = P3INTF;
- if (intf){
- P3INTF=0; //标识寄存器要软件清零。
-
- if (intf & 0x08){ //P35按下
- SEG0++; //显示0-9
- if(SEG0>9){
- SEG0=0;
- delay_ms(200); //测试使用延时,在开发过程中,千万不要在中断中使用延时。
- }
- }
- }
- }
-
- void Timer0_Isr(void) interrupt 1
- {
- static u8 time_count=0; //时间,设置静态变量,要不然每回中段都会重新初始化
-
- SEG_LED_refresh();
-
- time_count++; //时间+1
- if(time_count>=10){ //到达10ms
- TIME_10ms_flag=1; //到达10ms,标识为1;
- time_count=0; //时间清零
- }
- }
-
-
- void sys_init()
- {
- WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
- EAXFR = 1; //扩展寄存器(XFR)访问使能
- CKCON = 0; //提高访问XRAM速度
-
- P0M1 = 0x30; P0M0 = 0x30; //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
- P1M1 = 0x32; P1M0 = 0x32; //设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
- P2M1 = 0x3c; P2M0 = 0x3c; //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V),设置开漏模式需要断开PWM当DAC电路中的R2电阻
- P3M1 = 0x50; P3M0 = 0x50; //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
- P4M1 = 0x3c; P4M0 = 0x3c; //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
- P5M1 = 0x0c; P5M0 = 0x0c; //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
- P6M1 = 0xff; P6M0 = 0xff; //设置为漏极开路(实验箱加了上拉电阻到3.3V)
- P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
-
- //设置USB使用的时钟源
- IRC48MCR = 0x80; //使能内部48M高速IRC
- while (!(IRC48MCR & 0x01)); //等待时钟稳定
- }
-
- void delay_ms(u16 ms)
- {
- u16 i;
- do{
- i = MAIN_Fosc / 6000;
- while(--i);
- } while (--ms) ;
- }
复制代码
- #include "exit.h"
-
-
- void INT0_Init(void){ //外部中断0的初始化
- IT0=1; //外部中断源触发控制位:1为下降沿触发,0为上升沿与下降沿都可以触发
- IE0=0; //中段请求源标识:为1时外部中断向cpu请求中断,cpu响应时,硬件清零
- EX0=1; //1:允许INT0发出请求
- IT1=1; //外部中断源触发控制位:1为下降沿触发,0为上升沿与下降沿都可以触发
- IE1=0; //中段请求源标识:为1时外部中断向cpu请求中断,cpu响应时,硬件清零
- EX1=1; //1:允许INT0发出请求
-
- }
-
- /*复制这个文件的时候,记得把这个中段函数复制的main函数下,方便分析
- void INT0_Isr(void) interrupt 0
- {
-
- }
- */
-
- void P3exit_into(void){ //P3端口的初始化
- P3IM0=0x00; //低电平中断
- P3IM1=0xff;
- P3INTE=0x08; //使能P3口中断,因为只用P35,0010 0000,换成16进制0x20;
- }
复制代码
|