bs8412c-3 学习_中断,汇编与C语言
单片机源程序如下:- #include "BS84C12A-3.h"
- #include "BS84C12A_LIBV413/BS84C12A_LIBV413.h"
- #include <string.h>
- #include "SMG.H"
- extern void DISPLAY();
- extern void CLEAR();
- extern void PG_RESET();
- extern void TIME_ZHONGDUAN(); // 本来是汇编中的外部定时中断,现有声明为外部程序
- extern unsigned char LEDMATRIX_DISP_NUM[];
- extern unsigned char LEDMATRIX_DISP_RAM[];
- extern unsigned char TOUCHED;
- extern void LOAD_TKS_GLOBE_VARIES(); //;load TKS varies
- extern void LOAD_HXT_REFERENCE(); //;load HXT varies
- #define u8 unsigned char
- #define u16 unsigned int
- #define BEEP_PORT _pa7 // BEEP 引脚
- #define BEEP_PORT_CTRL _pac7 // BEEP 引脚控制,为 0 时允许输出
- #define COPY_SEGA _pb4
- #define COPY_SEGB _pb5
- #define COPY_SEGC _pb6
- #define COPY_SEGD _pb7
- #define COPY_SEGE _pc0
- #define COPY_SEGF _pc1
- #define COPY_SEGG _pc2
- #define COPY_SEGDP _pb3
- #define COPY_COM1 _pd3
- #define COPY_COM2 _pd2
- #define COPY_COM3 _pd0
- #define COPY_COM4 _pd1
- const u8 dispcode[10]={0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F};
- u8 dispbuff[4];
- u8 temp;
- char num1;
- char num2;
- unsigned int My_1MS_COUNTER;
- /*
- * 初始化中断设置
- */
- void initial()
- {
- _tmrc = 0b00010111;
- _tmr = 256-(1000*8/128); // 8M 主频
- _te = 1; // 使能定时/ 计数器中断
- _emi = 1; // 使能总中断
- // BEEP
- BEEP_PORT_CTRL = 0;
- BEEP_PORT = 0;
- }
- void smginit()
- {
- //seg口设置为输出
- COPY_SEGA=0;
- COPY_SEGB=0;
- COPY_SEGC=0;
- COPY_SEGD=0;
- COPY_SEGE=0;
- COPY_SEGF=0;
- COPY_SEGG=0;
- COPY_SEGDP=0;
-
- _pbc4=0;
- _pbc5=0;
- _pbc6=0;
- _pbc7=0;
- _pcc0=0;
- _pcc1=0;
- _pcc2=0;
- _pbc3=0;
- //com口设置为输出
- COPY_COM1=0;
- COPY_COM2=0;
- COPY_COM3=0;
- COPY_COM4=0;
- _pdc3=0;
- _pdc2=0;
- _pdc0=0;
- _pdc1=0;
-
- }
-
- DEFINE_ISR(My_Time_ISR_New, 0x0c) // 定时器中断
- {
- _clrwdt1();
- _clrwdt2();
-
- smgscan(); //扫描数码管,这里随主循环不定时的扫描,如果程序复杂时间保证不了足够快,
- //可能会有闪烁,这样的话,只能开一个时基中断或放进定时器中断里,
-
- My_1MS_COUNTER++;
- if(My_1MS_COUNTER>500)
- {
- My_1MS_COUNTER = 0;
- // smgscan();
-
- }
- }
-
- void dispnum(u16 num) //
- {
- dispbuff[0]=dispcode[num/1000%10];
- dispbuff[1]=dispcode[num/100%10];
- dispbuff[2]=dispcode[num/10%10];
- dispbuff[3]=dispcode[num%10];
- }
- //将一个字节每一个bit送至相应的io
- void setseg(u8 num)
- {
- mybit a;
- a.data=num;
- if(a.b.b0)COPY_SEGA=1;else COPY_SEGA=0;
- if(a.b.b1)COPY_SEGB=1;else COPY_SEGB=0;
- if(a.b.b2)COPY_SEGC=1;else COPY_SEGC=0;
- if(a.b.b3)COPY_SEGD=1;else COPY_SEGD=0;
- if(a.b.b4)COPY_SEGE=1;else COPY_SEGE=0;
- if(a.b.b5)COPY_SEGF=1;else COPY_SEGF=0;
- if(a.b.b6)COPY_SEGG=1;else COPY_SEGG=0;
- if(a.b.b7)COPY_SEGDP=1;else COPY_SEGDP=0;
-
- }
- //选择com口
- void setcom(u8 index)
- {
- switch(index)
- {
- case 0:COPY_COM1=1;break;
- case 1:COPY_COM2=1;break;
- case 2:COPY_COM3=1;break;
- case 3:COPY_COM4=1;break;
- default:break;
- }
- }
- void smgscan()
- {
- static u8 index=0;
- COPY_COM1=COPY_COM2=COPY_COM3=COPY_COM4=0; //消影
- setseg(dispbuff[index]); //输出seg口
- setcom(index); //输出com口
- if(++index>3)index=0;
- }
- /*
- * 延时函数
- */
- void delay(unsigned short ms)
- {
- unsigned short i, j;
-
- for (i=0; i<ms; ++i) {
- for (j=0; j<200; j++) {
- _clrwdt1();
- _clrwdt2();
- }
- }
- }
- /*
- * 使用数码管显示数字
- * pos 为 0 显示在左侧两个,为 1 显示右侧两个
- * temp 为温度的数值
- */
- void dispNumber(unsigned char pos, unsigned char num)
- {
- LEDMATRIX_DISP_NUM[pos*2] = num / 10;
- LEDMATRIX_DISP_NUM[pos*2+1] = num % 10;
- }
- void beep(unsigned short ms)
- {
- BEEP_PORT = 1;
- delay(ms);
- BEEP_PORT = 0;
- }
- void main()
- {
- PG_RESET();
- initial();
- beep(200);
-
- smginit();
- dispnum(1234);
-
- // num1 = 20;
- // num2 = 19;
- //
- // dispNumber(0, num1);
- // dispNumber(1, num2);
- // DISPLAY();
- // 初始化按键库
- LOAD_TKS_GLOBE_VARIES();
- BS84C12A_LIBV413_INITIAL();
- while(1) {
- _clrwdt1();
- _clrwdt2();
- // TIME_ZHONGDUAN(); // 调用外部显示程序,命名为“时间_中断”
- // BS84C12A_LIBV413();
- //
- // if (SCAN_CYCLEF && ANY_KEY_PRESSF) {
- // GET_KEY_BITMAP();
- //
- // if(DATA_BUF[0] & 0x01) {
- // // Key1
- // num1 = num1 + 1 > 99 ? 1: num1 + 1;
- // beep(100);
- // }
- //
- // if(DATA_BUF[0] & 0x02) {
- // // Key2
- // num1 = num1 - 1 < 0 ? 0: num1 - 1;
- // beep(100);
- // }
- //
- // if(DATA_BUF[0] & 0x04) {
- // // Key3
- // num2 = num2 + 1 > 99 ? 1: num2 + 1;
- // beep(100);
- // }
- //
- // if(DATA_BUF[0] & 0x08) {
- // // Key4
- // num2 = num2 - 1 < 0 ? 0: num2 - 1;
- // beep(100);
- // }
- //
- // // 非常重要,加上后不会连续触发按键
- // ANY_KEY_PRESSF = 0;
- // }
- //
- // dispNumber(0, num1);
- // dispNumber(1, num2);
- // DISPLAY();
-
-
-
- if(TKS_250MSF) //触摸库函数提供的时间标志位
- {
-
- // temp++; //250ms加一,为下面的显示调用而加
- // dispnum(temp);
- }
-
- }
- }
复制代码 以上代码的工程文件(仅供参考):
lesson_20220915_中断在C中.zip
(86.69 KB, 下载次数: 6)
|