占空比输出晶联讯显示屏

/*占空比输出测试 2017 4 26 PWMcgao******/
/*PWM 2017 4 16 pcb晶联讯显示屏*完成数字加减**/
/*****---------------************/
/*****|  频率输出测试    |**********/
/*****|  数值 00         |**********/
/****L284 CODE 1370*********************/
               #include <REG51.H>
               #include <intrins.H>
               #define  uint unsigned int  
               #define  uchar unsigned char
               sfr      AUXR=0x8e;                              //Auxiliary register
               sfr      P5=0xc8;
               uchar    code disdt[11]={0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xa3};
               uchar    code disds[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
               uint     vala,valb,valc;           /**/
               sbit     cs1=P3^5;                  //PIN16
               sbit     reset=P3^6;                  //PIN17
               sbit     rs=P3^7;                  //PIN18
               sbit     sda=P1^0;                  //PIN19
               sbit     sck=P1^1;                  //PIN20
               sbit     DATAUP=P1^5;              //加按键 PIN4
               sbit     DATADOWN=P1^2;              //减按键 PIN1
               sbit     RUN=P1^3;                  //运行键 PIN22018 6 26
               sbit     ENTER=P3^2;                  //确认键 PIN13
               sbit     PWM1=P5^4;                  //PWM输出
               sbit     PWM=P3^3;                  //PIN14
               bit        timeflag;                 /****/
               uint     m,n;                      /****个十百代码缓冲**/
               uint     aa=0;                       /****RUN FLAG****/
               uint     t1,t2,t3,t4;              /****总数个十百千****/
               void     delay(uint k);            /****延时****/
/*------------------延时子程序------------------------*/
               void delay(unsigned int t)
               {
                uint i,j;
                for(i=0;i<t;i++)
                for(j=0;j<500;j++);
               }
uchar     code zhuang1[]={
/*-- 文字: 状 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=16x16 --*/
0x08,0x30,0x00,0xFF,0x20,0x20,0x20,0x20,0xFF,0x20,0xE1,0x26,0x2C,0x20,0x20,0x00,
0x04,0x02,0x01,0xFF,0x40,0x20,0x18,0x07,0x00,0x00,0x03,0x0C,0x30,0x60,0x20,0x00};
uchar code tai1[]={
/*-- 文字: 态 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=16x16 --*/
0x00,0x04,0x04,0x04,0x84,0x44,0x34,0x4F,0x94,0x24,0x44,0x84,0x84,0x04,0x00,0x00,
0x00,0x60,0x39,0x01,0x00,0x3C,0x40,0x42,0x4C,0x40,0x40,0x70,0x04,0x09,0x31,0x00};
uchar code shi1[]={
/*-- 文字: 使 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=16x16 --*/
0x40,0x20,0xF0,0x1C,0x07,0xF2,0x94,0x94,0x94,0xFF,0x94,0x94,0x94,0xF4,0x04,0x00,
0x00,0x00,0x7F,0x00,0x40,0x41,0x22,0x14,0x0C,0x13,0x10,0x30,0x20,0x61,0x20,0x00};
uchar code yong1[]={
/*-- 文字: 用 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=16x16 --*/
0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,
0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x42,0x82,0x7F,0x00,0x00};
uchar code mao_hao[]={
/*-- 文字: : (冒号) --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=8x16 --*/
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00};
char code num[]={
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00
};
/*写指令到LCD 模块*/
              void transfer_command(int data1)
              {
              char i;
              cs1=0;
              rs=0;
               for(i=0;i<8;i++)
               {
               sck=0;
               if(data1&0x80) sda=1;
               else sda=0;
               sck=1;
               data1=data1<<=1;
               }
              }
/*写数据到LCD 模块*/
              void transfer_data(int data1)
              {
              char i;
              cs1=0;
              rs=1;
               for(i=0;i<8;i++)
               {
               sck=0;
               if(data1&0x80) sda=1;
               else sda=0;
               sck=1;
               data1=data1<<=1;
               }
              }
/************LCD 模块初始化***************/
              void initial_lcd()
              {
              cs1=0;
              reset=0; /*低电平复位*/
              delay(100);
              reset=1; /*复位完毕*/
              delay(20);
              transfer_command(0xe2); /*软复位*/
              delay(5);
              transfer_command(0x2c); /*升压步聚1*/
              delay(5);
              transfer_command(0x2e); /*升压步聚2*/
              delay(5);
              transfer_command(0x2f); /*升压步聚3*/
              delay(5);
              transfer_command(0x23); /*粗调对比度,可设置范围0x20~0x27*/
              transfer_command(0x81); /*微调对比度*/
              transfer_command(0x28); /*0x1a,微调对比度的值,可设置范围0x00~0x3f*/
              transfer_command(0xa2); /*1/9 偏压比(bias)*/
              transfer_command(0xc8); /*行扫描顺序:从上到下*/
              transfer_command(0xa0); /*列扫描顺序:从左到右*/
              transfer_command(0x40); /*起始行:第一行开始*/
              transfer_command(0xaf); /*开显示*/
              cs1=1;
              }
              void lcd_address(uchar page,uchar column)
              {
              cs1=0;
              column=column-1; //我们平常所说的第1 列,在LCD 驱动IC 里是第0 列。所以在这里减去
              page=page-1;
              transfer_command(0xb0+page); /*设置页地址。每页是8 行。一个画面的64 行被分成8 个页。我们平常所说的
第1 页,在LCD 驱动IC 里是第0 页,所以在这里减去1*/
              transfer_command(((column>>4)&0x0f)+0x10); //设置列地址的高4 位
              transfer_command(column&0x0f); //设置列地址的低4 位
              }
/*全屏清屏*/
              void clear_screen()
              {
              unsigned char i,j;
              cs1=0;
               for(i=0;i<9;i++)
               {
               lcd_address(1+i,1);
                for(j=0;j<132;j++)
                {
                transfer_data(0x00);
                }
               }
              cs1=1;          //
              }
/*显示16x16 点阵图像、汉字、生僻字或16x16 点阵的其他图标*/
              void display_graphic_16x16(uchar page,uchar column,uchar *dp)
              {
              uchar i,j;
              cs1=0;
               for(j=0;j<2;j++)
               {
               lcd_address(page+j,column);
                for (i=0;i<16;i++)
                {
                transfer_data(*dp); /*写数据到LCD,每写完一个8 位的数据后列地址自动加1*/
                dp++;
                }
               }
              cs1=1;
              }
/*显示8x16 点阵图像、ASCII, 或8x16 点阵的自造字符、其他图标*/
              void display_graphic_8x16(uchar page,uchar column,uchar *dp)
              {
              uchar i,j;
              cs1=0;
               for(j=0;j<2;j++)
               {
               lcd_address(page+j,column);
                for (i=0;i<8;i++)
                {
                transfer_data(*dp); /*写数据到LCD,每写完一个8 位的数据后列地址自动加1*/
                dp++;
                }
               }
              cs1=1;
              }
/*--------------数据转换------------------------*/
                void datachuange()
                {
                m=vala/10;                 /*减t1x1000再减t2X100*/
                n=vala-10*m;               /*分离千 百 十 个三位*/  
                }
/*----------参数加-----------------*/
               void   DataOn( )                  /*写数据B子函数*/
               {                                 /*子函数开始*/
               vala=vala+1;                      /**加一**/
               if(vala>99)
               vala=0;                           /*大于999归零*/
               }                                 /*子函数结束*/
/*----------参数减---------------*/
               void   DataDown( )                /*写数据B子函数*/
               {                                 /*子函数开始*/
               vala=vala-1;                      /**加一**/
               if(vala==0)
               vala=99;                         /*大于999归零*/
               }
/*---------------------*/
               void disdata()                   /*显示*/
               {
               display_graphic_8x16(1,(89),num+m*16); /*在第5 页,第89 列显示单个数字"0"*/
               display_graphic_8x16(1,(89+8*1),num+n*16); /*在第5 页,第97 列显示单个数字"0"*/
               }
/*---------------------*/
               void dis_data()                   /*显示*/
               {
               m=valb/10;                 /*减t1x1000再减t2X100*/
               n=valb-10*m;               /*分离千 百 十 个三位*/  
               display_graphic_8x16(5,(89),num+m*16); /*在第5 页,第89 列显示单个数字"0"*/
               display_graphic_8x16(5,(89+8*1),num+n*16); /*在第5 页,第97 列显示单个数字"0"*/
               }
/*------------定时-占空比输出------------*/    
               void time()           //需仿真
               {
               if(~!timeflag)
               {
               if(aa>=vala)
               {
                PWM=0;          // 低电平时间
                PWM1=0;
                aa=0;
                timeflag=0;       //取反定时标志
                }
               }
               else    if(!timeflag)
               {
                   if(aa>=valb)
                 {
                 PWM=1;           //高电平时间
                 PWM1=1;
                 aa=0;
                  timeflag=1;   //取反定时标志
                 }
                }
               }
/*------------------主循环程序----------------*/      
               void   main( )                    /*主程序开始*/
               {  
               aa=0;
               timeflag=1;
               datachuange();
               initial_lcd();
               clear_screen(); //clear all dots    清除所有显示点
               display_graphic_16x16(1,1,zhuang1); /*在第5 页,第1 列显示单个汉字"状"*/
               display_graphic_16x16(1,(1+16),tai1); /*在第5 页,第17 列显示单个汉字"态"*/
               display_graphic_8x16(1,(1+16*2),mao_hao); /*在第5 页,第25 列显示单个字符":"*/
               display_graphic_16x16(1,(1+16*2+8),shi1); /*在第5 页,第41 列显示单个汉字"使"*/
               display_graphic_16x16(1,(1+16*3+8),yong1); /*在第5 页,第49 列显示单个汉字"用"*/
               vala=0;
               datachuange();
               disdata();
               while(1)                          /*主函数循环*/
               {                                 /*开始kcounter,kstatus*/
                if(!DATAUP)                //检测按键加
                {                        //数据处理
                 DataOn();              //参数加
                 valb=100-vala;         //模拟显示100减设定值
                 datachuange();            //显示转换
                 disdata();                //显示设定参数
                 dis_data();            //显示100减设定值
                 delay(20);                //
                }                        //
                if(!DATADOWN)                //检测按键减  ENTER
                {                            //数据处理
                 DataDown();                //参数减
                 valb=100-vala;                //模拟显示100减设定值
                 datachuange();                //显示转换
                 disdata();                    //显示设定参数
                 dis_data();                //显示100减设定值
                 delay(20);                    //
                }
                if(!RUN)                //检测按键减  ENTER
                {                        //数据处理
                 while(1)
                 {                        //数据处理
                  delay(2000);
                  time();
                 }
                }
               }         //while 循环
              }             //主循

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,您需要确定使用哪个Cortex微控制器,因为不同的微控制器具有不同的GPIO数量和功能。一般来说,您需要将PWM输出连接到一个可调电阻,以便您可以通过更改电阻值来改变PWM的占空比。 以下是一个基本的C程序示例,该程序使用Cortex-M3微控制器的GPIO口控制PWM输出: ```c #include "stm32f10x.h" void PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; /* Enable GPIO clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* Enable TIM clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* Configure GPIO pin */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure Timer */ TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 1000; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /* Configure PWM */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &TIM_OCInitStructure); /* Enable Timer */ TIM_Cmd(TIM2, ENABLE); } int main(void) { PWM_Init(); while(1) { /* Change PWM duty cycle */ TIM_SetCompare1(TIM2, 250); delay(1000); TIM_SetCompare1(TIM2, 750); delay(1000); } } ``` 您可以根据需要更改此示例,例如更改GPIO引脚或PWM占空比。此外,您还需要编写一个`delay()`函数,以便在更改PWM占空比时等待一段时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值