找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 952|回复: 0
收起左侧

bs8412c-3单片机学习_中断程序

[复制链接]
ID:145384 发表于 2022-12-12 06:58 | 显示全部楼层 |阅读模式
bs8412c-3 学习_中断,汇编与C语言
单片机源程序如下:
  1. #include "BS84C12A-3.h"
  2. #include "BS84C12A_LIBV413/BS84C12A_LIBV413.h"
  3. #include <string.h>
  4. #include "SMG.H"

  5. extern void DISPLAY();
  6. extern void CLEAR();
  7. extern void PG_RESET();
  8. extern void TIME_ZHONGDUAN();    // 本来是汇编中的外部定时中断,现有声明为外部程序

  9. extern unsigned char LEDMATRIX_DISP_NUM[];
  10. extern unsigned char LEDMATRIX_DISP_RAM[];
  11. extern unsigned char TOUCHED;

  12. extern void LOAD_TKS_GLOBE_VARIES();                //;load TKS varies
  13. extern void LOAD_HXT_REFERENCE();                   //;load HXT varies

  14. #define u8 unsigned char
  15. #define u16 unsigned int
  16. #define BEEP_PORT                        _pa7                                // BEEP 引脚
  17. #define BEEP_PORT_CTRL                _pac7                                // BEEP 引脚控制,为 0 时允许输出

  18. #define COPY_SEGA   _pb4
  19. #define COPY_SEGB   _pb5
  20. #define COPY_SEGC   _pb6
  21. #define COPY_SEGD   _pb7
  22. #define COPY_SEGE   _pc0
  23. #define COPY_SEGF   _pc1
  24. #define COPY_SEGG   _pc2
  25. #define COPY_SEGDP  _pb3


  26. #define COPY_COM1  _pd3
  27. #define COPY_COM2  _pd2
  28. #define COPY_COM3  _pd0
  29. #define COPY_COM4  _pd1

  30. const u8 dispcode[10]={0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F};

  31. u8 dispbuff[4];

  32. u8 temp;
  33. char num1;
  34. char num2;
  35. unsigned int My_1MS_COUNTER;

  36. /*
  37. * 初始化中断设置
  38. */
  39. void initial()
  40. {
  41.         _tmrc = 0b00010111;
  42.         _tmr = 256-(1000*8/128);        // 8M 主频
  43.         _te = 1;                                        // 使能定时/ 计数器中断
  44.         _emi = 1;                                        // 使能总中断

  45.         // BEEP
  46.         BEEP_PORT_CTRL = 0;
  47.         BEEP_PORT = 0;
  48. }

  49. void smginit()
  50. {
  51.         //seg口设置为输出
  52.         COPY_SEGA=0;
  53.         COPY_SEGB=0;
  54.         COPY_SEGC=0;
  55.         COPY_SEGD=0;
  56.         COPY_SEGE=0;
  57.         COPY_SEGF=0;
  58.         COPY_SEGG=0;
  59.         COPY_SEGDP=0;
  60.        
  61.         _pbc4=0;
  62.         _pbc5=0;
  63.         _pbc6=0;
  64.         _pbc7=0;
  65.         _pcc0=0;
  66.         _pcc1=0;
  67.         _pcc2=0;
  68.         _pbc3=0;

  69.         //com口设置为输出
  70.         COPY_COM1=0;
  71.         COPY_COM2=0;
  72.         COPY_COM3=0;
  73.         COPY_COM4=0;
  74.         _pdc3=0;
  75.         _pdc2=0;
  76.         _pdc0=0;
  77.         _pdc1=0;               
  78.        
  79. }

  80. DEFINE_ISR(My_Time_ISR_New, 0x0c)    // 定时器中断
  81. {
  82.         _clrwdt1();
  83.         _clrwdt2();
  84.        
  85.         smgscan();       //扫描数码管,这里随主循环不定时的扫描,如果程序复杂时间保证不了足够快,
  86.                          //可能会有闪烁,这样的话,只能开一个时基中断或放进定时器中断里,
  87.                
  88.         My_1MS_COUNTER++;
  89.         if(My_1MS_COUNTER>500)
  90.         {
  91.                 My_1MS_COUNTER = 0;
  92. //                smgscan();
  93.                
  94.         }
  95. }

  96.      
  97. void dispnum(u16 num)                //
  98. {
  99.         dispbuff[0]=dispcode[num/1000%10];       
  100.         dispbuff[1]=dispcode[num/100%10];       
  101.         dispbuff[2]=dispcode[num/10%10];       
  102.         dispbuff[3]=dispcode[num%10];       
  103. }


  104. //将一个字节每一个bit送至相应的io
  105. void setseg(u8 num)
  106. {
  107.         mybit a;
  108.         a.data=num;
  109.         if(a.b.b0)COPY_SEGA=1;else COPY_SEGA=0;
  110.         if(a.b.b1)COPY_SEGB=1;else COPY_SEGB=0;
  111.         if(a.b.b2)COPY_SEGC=1;else COPY_SEGC=0;
  112.         if(a.b.b3)COPY_SEGD=1;else COPY_SEGD=0;
  113.         if(a.b.b4)COPY_SEGE=1;else COPY_SEGE=0;
  114.         if(a.b.b5)COPY_SEGF=1;else COPY_SEGF=0;
  115.         if(a.b.b6)COPY_SEGG=1;else COPY_SEGG=0;
  116.         if(a.b.b7)COPY_SEGDP=1;else COPY_SEGDP=0;
  117.        
  118. }

  119. //选择com口
  120. void setcom(u8 index)
  121. {
  122.         switch(index)
  123.         {
  124.                 case 0:COPY_COM1=1;break;
  125.                 case 1:COPY_COM2=1;break;
  126.                 case 2:COPY_COM3=1;break;
  127.                 case 3:COPY_COM4=1;break;
  128.                 default:break;       
  129.         }               
  130. }

  131. void smgscan()
  132. {
  133.         static u8 index=0;
  134.         COPY_COM1=COPY_COM2=COPY_COM3=COPY_COM4=0;  //消影
  135.         setseg(dispbuff[index]);                    //输出seg口
  136.         setcom(index);                              //输出com口
  137.         if(++index>3)index=0;       
  138. }

  139. /*
  140. * 延时函数
  141. */
  142. void delay(unsigned short ms)
  143. {
  144.         unsigned short i, j;
  145.        
  146.         for (i=0; i<ms; ++i) {
  147.                 for (j=0; j<200; j++) {
  148.                         _clrwdt1();
  149.                         _clrwdt2();
  150.                 }
  151.         }
  152. }


  153. /*
  154. * 使用数码管显示数字
  155. * pos 为 0 显示在左侧两个,为 1 显示右侧两个
  156. * temp 为温度的数值
  157. */
  158. void dispNumber(unsigned char pos, unsigned char num)
  159. {
  160.         LEDMATRIX_DISP_NUM[pos*2] = num / 10;
  161.         LEDMATRIX_DISP_NUM[pos*2+1] = num % 10;
  162. }

  163. void beep(unsigned short ms)
  164. {
  165.         BEEP_PORT = 1;

  166.         delay(ms);

  167.         BEEP_PORT = 0;
  168. }


  169. void main()
  170. {
  171.         PG_RESET();
  172.         initial();

  173.         beep(200);
  174.        
  175.         smginit();       
  176.         dispnum(1234);
  177.        
  178. //        num1 = 20;
  179. //        num2 = 19;
  180. //
  181. //        dispNumber(0, num1);
  182. //        dispNumber(1, num2);
  183. //        DISPLAY();

  184.         // 初始化按键库
  185.         LOAD_TKS_GLOBE_VARIES();
  186.         BS84C12A_LIBV413_INITIAL();

  187.         while(1) {
  188.                 _clrwdt1();
  189.                 _clrwdt2();

  190. //                TIME_ZHONGDUAN();          // 调用外部显示程序,命名为“时间_中断”
  191. //                BS84C12A_LIBV413();
  192. //               
  193. //                if (SCAN_CYCLEF && ANY_KEY_PRESSF) {
  194. //                        GET_KEY_BITMAP();
  195. //                       
  196. //                        if(DATA_BUF[0] & 0x01) {
  197. //                                // Key1
  198. //                                num1 = num1 + 1 > 99 ? 1: num1 + 1;
  199. //                                beep(100);
  200. //                        }
  201. //                       
  202. //                        if(DATA_BUF[0] & 0x02) {
  203. //                                // Key2
  204. //                                num1 = num1 - 1 < 0 ? 0: num1 - 1;
  205. //                                beep(100);
  206. //                        }
  207. //                       
  208. //                        if(DATA_BUF[0] & 0x04) {
  209. //                                // Key3
  210. //                                num2 = num2 + 1 > 99 ? 1: num2 + 1;
  211. //                                beep(100);
  212. //                        }
  213. //       
  214. //                        if(DATA_BUF[0] & 0x08) {
  215. //                                // Key4
  216. //                                num2 = num2 - 1 < 0 ? 0: num2 - 1;
  217. //                                beep(100);
  218. //                        }
  219. //                       
  220. //                        // 非常重要,加上后不会连续触发按键
  221. //                        ANY_KEY_PRESSF = 0;
  222. //                }
  223. //               
  224. //                dispNumber(0, num1);
  225. //                dispNumber(1, num2);
  226. //                DISPLAY();
  227.                
  228.                
  229.        
  230.                 if(TKS_250MSF)       //触摸库函数提供的时间标志位
  231.                 {
  232.                        
  233. //                        temp++;          //250ms加一,为下面的显示调用而加
  234. //                        dispnum(temp);
  235.                 }
  236.                
  237.         }
  238. }

复制代码
以上代码的工程文件(仅供参考): lesson_20220915_中断在C中.zip (86.69 KB, 下载次数: 6)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表