找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1648|回复: 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 单片机教程网

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