久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1640|回復: 0
打印 上一主題 下一主題
收起左側

發一個中微的115X單片機的DEMO IO設置示例程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:598611 發表于 2023-10-9 17:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
給大家分享一個中微SC8P115X的DEMO程序

單片機源程序如下:
  1. /*-------------------------------------------

  2. 程序名稱:IO設置示例程序

  3. 1153的口線分為PORTA,PORTB;1152有PORTB
  4. PORTA對應的寄存器有PORTA,TRISA(控制輸入輸出狀態),UPDOWNA(控制上下拉電阻,高4位控制上拉,低4位控制下拉)
  5. PORTB對應的寄存器有PORTB,TRISB(控制輸入輸出狀態),WPUB(控制上拉電阻),PDCONB(控制下拉電阻),
  6.                                                                                 ODCONB(控制開漏輸出),IOCB(控制電平變化中斷)
  7. 備注:PORTA0做上拉輸入,PORTA1做輸入口, PORTA2做下拉輸入,
  8.                         RORTB0做開漏輸出,其余口全為輸出
  9.       PORTA3根據PORTA1狀態輸出,為高:輸出高,為低:輸出低
  10.       PORTB0口根據PORTA0口狀態,為高:
  11.       
  12. *本程序由 &應用支持部& 編寫整理
  13. -------------------------------------------*/


  14. #include <sc.h>                                        //芯片頭文件,會根據工程選項自動尋找對應型號頭文件
  15. #include "TypeDef.h"
  16. #include "main.h"
  17. #include "global_variable.h"
  18. #define _DEBUG

  19. /*------------------------------------------
  20. 口線定義
  21. ***************************************************/
  22. #define                KEY_MODE        PORTB3                                //定義RORTB3口
  23. #define         KEY_SUB                PORTB4                                //定義PORTB4口
  24. #define         KEY_ADD                PORTB5                                //定義PORTB5口


  25. /**************************************************
  26. 函數聲明
  27. **************************************************/

  28. void Init_System();
  29. void Refurbish_Sfr();
  30. void Kscan();
  31. void Maink();
  32. void Set_PWM_Period(unsigned int Period);
  33. void Set_PWM0(unsigned char DutyRatio_H,unsigned char DutyRatio_L);
  34. void Set_PWM1(unsigned char DutyRatio_H,unsigned char DutyRatio_L);
  35. void Set_PWM2(unsigned char DutyRatio_H,unsigned char DutyRatio_L);
  36. void Set_PWM3(unsigned char DutyRatio_H,unsigned char DutyRatio_L);
  37. void Set_PWM4(unsigned char DutyRatio_H,unsigned char DutyRatio_L);
  38. void Set_PWM_Off();
  39. void DelayXms(unsigned char x);


  40. /*********************************************************
  41. 全局變量定義
  42. *********************************************************/


  43. /*********************************************************
  44. 函數名稱:DelayXms
  45. 函數功能:死循環延時
  46. 入口參數:X
  47. 出口參數:
  48. 備    注:
  49. *********************************************************/
  50. void DelayXms(unsigned char x)
  51. {
  52.         unsigned char i,j;
  53.         for(i=x;i>0;i--)
  54.                 asm("clrwdt");
  55.                 for(j=153;j>0;j--);
  56. }
  57. /**********************************************************
  58. 函數名稱:Init_System
  59. 函數功能:系統初始化
  60. 入口參數:無
  61. 出口參數:無
  62. 備    注:
  63. **********************************************************/

  64. //系統初始化
  65. void Init_System()
  66. {
  67.         asm("nop");
  68.         asm("clrwdt");
  69.         OPTION_REG =0;                                        //預分頻給TMR0 ,Timer0使用內部時鐘Focs/4,預分頻比為1:2
  70.         OSCCON = 0XF0;                                        //內部振蕩器8M,CONFIG關閉WDT時必須打開WDT,
  71.        
  72.         UPDOWNA = 0B00000000;                                //配置PORTA上拉下拉情況
  73.         WPUB = 0B00111000;                                //配置PORTB上拉情況
  74.         PDCONB = 0B00000000;                        //配置PORTB下拉情況
  75.         ODCONB = 0B00000000;                        //配置PORTB開漏輸出情況
  76.         IOCB = 0B00000000;                                //配置PORTB電平變化中斷情況
  77.        
  78.         PORTA = 0XFF;
  79.         PORTB = 0XFF;
  80.        
  81.         TRISA = 0B00000000;                                //配置IO狀態
  82.         TRISB = 0B00111000;
  83.         //設置口線狀態
  84.         PORTA = 0XFF;
  85.         PORTB = 0XFF;

  86. //---------------------------------------
  87. //125us中斷初始化
  88.         TMR0PRD = 124;                                //賦予初始值
  89.         INTCON = 0xA0;                        //允許所有未被屏蔽的中斷、禁止外設中斷,使能Timer0
  90.         OSCCON |= 0X01;                        //修改TMR0PRD需要先將OSCCON,0清零,賦值后再置1
  91.                        
  92. }


  93. /**********************************************************
  94. 函數名稱:Refurbish_Sfr
  95. 函數功能:刷新LED模塊配置以及一些特殊功能寄存器
  96. 入口參數:無
  97. 出口參數:無
  98. 備    注:每隔一定時間刷新一次SFR可增強抗干擾能力
  99. **********************************************************/
  100. void Refurbish_Sfr()
  101. {
  102.        
  103.         TRISA = 0X00;                                        //
  104.         TRISB = 0B00111000;                //
  105.        
  106.                
  107.         //按鍵口開上拉
  108.         UPDOWNA = 0X00;
  109.         WPUB = 0B00111000;
  110.                
  111. }

  112. /**********************************************************
  113. 函數名稱:main
  114. 函數功能:
  115. 入口參數:無
  116. 出口參數:無
  117. 備    注:無
  118. **********************************************************/
  119. void main(void)
  120. {
  121.         Init_System();
  122.         DelayXms(200);
  123.         PWMCTR0        = 0;
  124.         PWMCTR1        = 0;
  125.         PWMCTR2        = 0;
  126.         Set_PWM_Period(0XE0FF);                //PWM模式初始化,周期512us,所有PWM共用一個周期設置
  127.                                                                 //PWM周期的高兩位放置與PWMCTR2的第6,7位,
  128.                                                                 //PWM周期時鐘選擇在PWMCTR2的第4,5位,目前選擇4分頻
  129.         Set_PWM0(0X02,0X00);                //PWM占空比初始化

  130.         while(1)
  131.         {
  132.                 if(flag_mainloop)
  133.                 {
  134.                         flag_mainloop = 0;
  135.                         OPTION_REG = 0B00000000;        //Timer0使用內部時鐘,預分頻為1:2
  136.                         asm("clrwdt");
  137.                         OSCCON |= 0X80;                 //打開WDT允許位
  138.                         Refurbish_Sfr();                //刷新專用寄存器       
  139.                         Kscan();                        //按鍵掃描
  140.                         Maink();                        //讀取觸摸掃描數據,處理按鍵功能
  141.                 //        SetTiming();                //定時處理
  142.                                                
  143.                 }
  144.         }
  145. }

  146. /***********************************************************
  147. 中斷服務函數
  148. 函數名稱:Isr_Timer()
  149. 函數功能:中斷處理函數
  150. 入口參數:
  151. 出口參數:
  152. 備    注:125US定時2中斷
  153. ***********************************************************/
  154. void interrupt Isr_Timer()
  155. {
  156.         if(T0IF)                        //若只使能了一個中斷源,可以略去判斷
  157.         {
  158.                 T0IF = 0;
  159.                 MainTime++;
  160.                 if(MainTime > 16)
  161.                 {
  162.                         MainTime = 0;
  163.                         flag_mainloop = 1;                //2mS進一次主程序
  164.                 }
  165.                
  166.                
  167.         }
  168. }

  169. /***********************************************************
  170. 函數名稱:Kscan()
  171. 函數功能:按鍵掃描
  172. 入口參數:無
  173. 出口參數:i
  174. 備    注:
  175. ***********************************************************/
  176. void Kscan()
  177. {
  178.         static volatile unsigned char        Keyc = 0;       
  179.         volatile unsigned char Kcount, Keyflash;
  180.         Kcount = 1;
  181.         Keyflash = 0;
  182.         if( !(PORTB&0x8))
  183.                 {
  184.                         Keyflash = Kcount;
  185.                 }
  186.                 else if(!(PORTB&0x010))
  187.                         {
  188.                         ++Kcount;
  189.                         Keyflash = Kcount;
  190.                         }
  191.                         else if(!(PORTB&0x020))
  192.                                 {
  193.                                 ++Kcount;
  194.                                 Keyflash = Kcount;
  195.                                 }
  196.                         else
  197.                                 {
  198.                                         Keyc = 0;
  199.                                         Flag_Key_Rh = 0;
  200.                                         Flag_Key_En = 0;
  201.                                         Kold = 0;
  202.                                 }
  203.         if (Keyflash != 0)
  204.                 {
  205.                         if (Keyflash == Kold)
  206.                                 {
  207.                                         ++Keyc;
  208.                                         if(Keyc > 16)
  209.                                                 {
  210.                                                         Keyc = 0;
  211.                                                         if (!Flag_Key_Rh)
  212.                                                                 {
  213.                                                                         Flag_Key_Rh = 1;
  214.                                                                         Flag_Key_En = 1;
  215.                                                                 }
  216.                                                 }
  217.                                 }
  218.                                 else
  219.                                         {
  220.                                                 Keyc = 0;
  221.                                                 Kold = Keyflash;
  222.                                                 Flag_Key_Rh = 0;
  223.                                                 Flag_Key_En = 0;
  224.                                         }
  225.                 }
  226. }
  227. /************************************************************
  228. 函數名稱:Maink_Mode()
  229. 函數功能:功能鍵處理函數
  230. 入口參數:無
  231. 出口參數:無
  232. 備    注:
  233. ************************************************************/
  234. void Maink_Mode()
  235. {
  236.         static volatile unsigned char        Mode_C = 0;
  237.                 Mode_C++;
  238.                 if(Mode_C >= 6)
  239.                                         Mode_C = 0;
  240.                 switch(Mode_C)
  241.                         {
  242.                                 case 0x00:  Set_PWM0(0X02,0X00);break;
  243.                                 case 0x01:        Set_PWM1(0X02,0X00);break;
  244.                                 case 0x02:        Set_PWM2(0X02,0X00);break;
  245.                                 case 0x03:        Set_PWM3(0X02,0X00);break;
  246.                                 case 0x04:        Set_PWM4(0X02,0X00);break;
  247.                                 case 0x05:        Set_PWM_Off();break;
  248.                                
  249.                                 default:break;
  250.                         }

  251. }

  252. /************************************************************
  253. 函數名稱:Maink_Dec()
  254. 函數功能:減鍵處理函數
  255. 入口參數:無
  256. 出口參數:無
  257. 備    注:
  258. ************************************************************/
  259. void Maink_Dec()
  260. {
  261.        
  262.        

  263. }
  264. /************************************************************
  265. 函數名稱:Maink_Add()
  266. 函數功能:加鍵處理函數
  267. 入口參數:無
  268. 出口參數:無
  269. 備    注:
  270. ************************************************************/
  271. void Maink_Add()
  272. {
  273.        
  274. }

  275. /***************************************************
  276. 函數名稱:Maink()
  277. 函數功能:按鍵處理函數
  278. 入口參數:Flag_Key_En
  279. 出口參數:無
  280. 備    注:
  281. ***************************************************/
  282. void Maink()
  283. {
  284.        
  285.         if(Flag_Key_En)
  286.         {
  287.                 Flag_Key_En=0;
  288.                         switch(Kold)
  289.                         {
  290.                                 case 0x01:        Maink_Mode();break;
  291.                                 case 0x02:        Maink_Dec();break;
  292.                                 case 0x03:        Maink_Add();break;
  293.                                
  294.                                 default:break;
  295.                         }
  296.        
  297.         }
  298.        
  299. }

  300. /***********************************************
  301. 函數名稱:Set_PWM_Period
  302. 函數功能:PWM模式周期初始化
  303. 入口參數:Period低8位 - 周期寄存器值低8位(8M主頻,時鐘選擇00,則間隔0.125us)
  304.                   Period高8位 - 周期寄存器值高2位(輸入00~11)及時鐘選擇位(輸入00~11)
  305.                   
  306. 出口參數:無
  307. 備注:          占空比 = 占空比寄存器值/(周期寄存器值+1)
  308.               在PWM周期設置后,不能修改PWMCTR2的高四位   
  309. ************************************************/
  310. void Set_PWM_Period(unsigned int Period)//, unsigned char Period_L)
  311. {
  312.                 PWM_PRD = Period;                        //裝載PWM_PRD寄存器設置PWM周期低8位
  313.                 PWMCTR2        = Period >>8 ;                //裝載PWMCTR2寄存器設置PWM周期高2位及PWM時鐘
  314. }

  315. /***********************************************
  316. 函數名稱:Set_PWMX
  317. 函數功能:PWM模式占空比初始化
  318. 入口參數:DutyRatio_L - 占空比寄存器值低8位(輸入PWMR)
  319.                   DutyRatio_H - 占空比寄存器值高2位(輸入00~11)(輸入PWMCTR1或PWMCTR0)
  320.                   
  321. 出口參數:無
  322. 備注:          占空比 = 占空比寄存器值/(周期寄存器值+1)
  323.               在PWM周期設置后,不能修改PWMCTR2的高四位,
  324.                   設置好占空比后,如要修改其余PWM的占空比,不要修改已設置的占空比高兩位的值   
  325. ************************************************/

  326. void Set_PWM0(unsigned char DutyRatio_H,unsigned char DutyRatio_L)
  327. {
  328.                        
  329.                         PWMCTR2 &= 0XF8;                                        //選擇PWM0,
  330.                         PWMR = DutyRatio_L ;                                //裝載PWMR寄存器設置PWM0占空比低8位
  331.                        
  332.                         PWMCTR1 = (DutyRatio_H & 0X03) | (PWMCTR1&0xfc);        //裝載PWMCTR1寄存器設置PWM0占空比高2位
  333.                         PWMCTR0 |= 0X01 ;
  334.                         TRISB &= 0B11111110;                                //清零TRIB0位,使能PWM0引腳輸出驅動器
  335. }

  336. void Set_PWM1(unsigned char DutyRatio_H,unsigned char DutyRatio_L)
  337. {       
  338.                        
  339.                         PWMCTR2 = PWMCTR2 &0XF8 | 0X01;                                        //選擇PWM1
  340.                                                                                                                                                                                                 //選擇PWM0,
  341.         PWMR = DutyRatio_L ;                                //裝載PWMR寄存器設置PWM1占空比低8位
  342.                        
  343.                        
  344.                         PWMCTR1 = ((DutyRatio_H << 2)& 0X0C) | (PWMCTR1&0xf3);
  345.                                         //裝載PWMCTR1寄存器設置PWM1占空比高2位,不改變其余已設置的數據
  346.                        
  347.                         PWMCTR0 |= 0X02 ;                                        //使能PWM1
  348.                         TRISB &= 0B11111101;                                //清零TRIB1位,使能PWM1引腳輸出驅動器
  349. }

  350. void Set_PWM2(unsigned char DutyRatio_H,unsigned char DutyRatio_L)
  351. {       
  352.                        
  353.                         PWMCTR2 = PWMCTR2 &0XF8 | 0X02;                                        //選擇PWM2
  354.                                                                                                                                                                                                 //選擇PWM0,
  355.                         PWMR = DutyRatio_L ;                                //裝載PWMR寄存器設置PWM2占空比低8位
  356.                        
  357.                         PWMCTR1 = ((DutyRatio_H << 4)& 0X30) | (PWMCTR1&0xcf);
  358.                        
  359.                         PWMCTR0 |= 0X04 ;                                        //使能PWM2
  360.                         TRISB &= 0B11111011;                                //清零TRIB2位,使能PWM2引腳輸出驅動器
  361. }

  362. void Set_PWM3(unsigned char DutyRatio_H,unsigned char DutyRatio_L)
  363. {       
  364.                                                
  365.                         PWMCTR2 = PWMCTR2 &0XF8 | 0X03;                                        //選擇PWM3
  366.                                                                                                                                                                                                 //選擇PWM0,
  367.                         PWMR = DutyRatio_L ;                                //裝載PWMR寄存器設置PWM2占空比低8位
  368.                        
  369.                        
  370.                         PWMCTR1 = ((DutyRatio_H << 6)& 0XC0) | (PWMCTR1&0x3f);                //裝載PWMCTR1寄存器設置PWM3占空比高2位
  371.                        
  372.                         PWMCTR0 |= 0X08 ;                                        //使能PWM3
  373.                         TRISA &= 0B11111011;                                //清零TRIA2位,使能PWM3引腳輸出驅動器
  374. }

  375. void Set_PWM4(unsigned char DutyRatio_H,unsigned char DutyRatio_L)
  376. {       
  377.                                                
  378.                         PWMCTR2 = PWMCTR2 &0XF8 | 0X04;                                        //選擇PWM4
  379.                                                                                                                                                                                                 //選擇PWM0,
  380.                         PWMR = DutyRatio_L ;                                //裝載PWMR寄存器設置PWM2占空比低8位
  381.                         PWMCTR0 = ((DutyRatio_H << 6)& 0XC0)| PWMCTR0;                //裝載PWMCTR0寄存器設置PW4占空比高2位
  382.                         PWMCTR0 |= 0X010 ;                                        //使能PWM4
  383.                         TRISA &= 0B11110111;                                //清零TRIA3位,使能PWM4引腳輸出驅動器
  384. }
  385. /***************************************************
  386. 函數名稱:Set_PWM_Off()
  387. 函數功能:關閉PWM處理函數
  388. 入口參數:無
  389. 出口參數:無
  390. 備    注:
  391. ***************************************************/
  392. void Set_PWM_Off()
  393. {
  394.                 PWMCTR0 = 0;
  395.                 PORTB |= 0B00000111;
  396.                 PORTA |= 0B11111100;
  397. }
復制代碼

原理圖: 無
仿真: 無
代碼: SC8P115X-DEMOcc.rar (74.9 KB, 下載次數: 14)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产农村一级国产农村 | 亚洲欧美第一视频 | 国产性网 | 国产精品久久久久久久粉嫩 | 亚洲乱码一区二区三区在线观看 | 黑人巨大精品欧美一区二区一视频 | 欧美成年人网站 | 国产精品久久久久久久久久不蜜臀 | 一级做受毛片免费大片 | 亚洲国产成人精品女人久久久 | 一区视频在线 | 国产精品久久国产精品久久 | 涩涩视频大全 | 伦理片97| 99久久久久久| 国产成人精品一区二 | 亚洲精品一区二区三区四区高清 | 日韩精品免费在线观看 | 99精品网| 亚洲啪啪 | 久久久tv | 奇米四色在线观看 | 日韩av免费在线电影 | 欧美 日韩 亚洲91麻豆精品 | 91传媒在线观看 | 麻豆av一区二区三区久久 | 亚洲中午字幕 | 久久综合888 | 久久爆操 | 日韩不卡一区二区 | 中文字幕国 | 国产精品日本一区二区不卡视频 | 欧美精品在线一区 | 在线日韩视频 | 一级午夜aaa免费看三区 | 国产精品1 | 国产一区二区三区在线 | 丁香婷婷在线视频 | 色狠狠一区 | 天天精品在线 | av网站免费观看 |