找回密码
 立即注册

QQ登录

只需一步,快速开始

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

vk1072段码驱动C语言程序,亲测ok

[复制链接]
ID:245473 发表于 2018-11-8 20:40 | 显示全部楼层 |阅读模式
vk1072段码驱动C语言,亲测

单片机源程序如下:
  1. /**
  2.   ******************************************************************************
  3.   * @file    vk1072C.c
  4.   * @author  kevin_guo
  5.   * @version V1.0.0
  6.   * @date    05-17-2018
  7.   * @brief   This file contains all the vk1072C functions.
  8.         *          此文件适用于 VK1072C
  9.   ******************************************************************************
  10.   * @attention
  11.   ******************************************************************************
  12.   */       
  13. /* Includes ------------------------------------------------------------------*/
  14. #include "vk1072C.h"
  15.   
  16. /* Private typedef -----------------------------------------------------------*/
  17. /* Private define ------------------------------------------------------------*/
  18. #define VK1072C_BASE100MS        226757 //通过n个nop指令实现100mS延时,根据单片机修改此常数
  19. #define VK1072C_CLK        10        //WR信号线频率 ,由Vk1072C_Delay实现, =10->100kHz =100->11.11kHz
  20. /* Private macro -------------------------------------------------------------*/
  21. /* Private variables ---------------------------------------------------------*/
  22. const unsigned char vk1072C_segtab[VK1072C_SEGNUM]={
  23.         0,1,2,3,4,5,13,14,15,16,17,18,19,26,27,28,29,30
  24. };
  25. unsigned char vk1072C_addrbit=6;//驱动ic的ram地址线数A5-A0,
  26. unsigned char vk1072C_segi,vk1072C_comi;
  27. unsigned char vk1072C_maxcom=4;//驱动的com数可以是4com,3com,2com
  28. unsigned char vk1072C_dispram[VK1072C_SEGNUM];//显示RAM buffer只使用低4位,bit0->com0,bit1->com1,bit2->com2,bit3->com3
  29. /* Private function prototypes -----------------------------------------------*/
  30. /**
  31.   * @brief  Inserts a delay time.
  32.   * @param  ucDat-> 延时时间
  33.   * @retval None
  34.   */
  35. void Vk1072C_Delay(unsigned int ucDat)
  36. {//ucDat=10->100kHz ucDat=100->11.11kHz ucDat=226757->100mS
  37.         while(ucDat--)
  38.         {//nop指令根据单片机做相应的修改
  39.                 __nop();__nop();__nop();__nop();__nop();
  40.                 __nop();__nop();__nop();__nop();__nop();
  41.                 __nop();__nop();__nop();__nop();__nop();
  42.                 __nop();__nop();__nop();__nop();__nop();
  43.                 __nop();__nop();//__nop();__nop();__nop();
  44.         }
  45. }
  46. /**
  47.   * @brief  Vk1072C clk
  48.   * @param  None
  49.   * @retval None
  50.   */
  51. void WriteClockVk1072C(void)
  52. {
  53.         VK1072C_WR_L();
  54.         Vk1072C_Delay(VK1072C_CLK);
  55.         VK1072C_WR_H();       
  56.         Vk1072C_Delay(VK1072C_CLK);       
  57. }
  58. /**
  59.   * @brief  Write Vk1072C Command
  60.   * @param  FunctonCode->功能/命令码
  61.   * @retval None
  62.   */
  63. void WriteCommandVk1072C(unsigned char FunctonCode)
  64. {
  65.         unsigned char Shift = 0x80;
  66.         unsigned char i;
  67.        
  68.         VK1072C_CS_L();   //CS 片选开   
  69.         Vk1072C_Delay(VK1072C_CLK/2);
  70.         VK1072C_DATA_H();  
  71.         WriteClockVk1072C();
  72.         VK1072C_DATA_L();  
  73.         WriteClockVk1072C();
  74.         VK1072C_DATA_L();  
  75.         WriteClockVk1072C();

  76.         for(i = 0; i < 8; i++)
  77.         {
  78.          if(Shift & FunctonCode)        
  79.                  VK1072C_DATA_H();
  80.          else
  81.                  VK1072C_DATA_L();          

  82.          WriteClockVk1072C();
  83.          Shift = Shift >> 1;
  84.         }
  85.   VK1072C_DATA_L();
  86.         WriteClockVk1072C();        //发送一个 0 16xx中最后一位 X
  87.   VK1072C_CS_H();                         //CS 片选关  
  88.         Vk1072C_Delay(VK1072C_CLK/2);
  89.   VK1072C_DATA_H();
  90. }
  91. /**
  92.   * @brief  Write 1 data to Vk1072C
  93.   * @param  Addr->写入ram的地址
  94.   * @param  Databuf->写入ram的数据
  95.   * @retval None
  96.   */
  97. void Write1DataVk1072C(unsigned char Addr,unsigned char Dat)
  98. {
  99.         unsigned char i;
  100.         unsigned char Shift;
  101.        
  102.         Shift = 0x20; //屏蔽高3位 只用5位
  103.        
  104.         VK1072C_CS_L();  //CS 片选开
  105.         Vk1072C_Delay(VK1072C_CLK/2);

  106.         VK1072C_DATA_H();  
  107.         WriteClockVk1072C();  //101
  108.         VK1072C_DATA_L();  
  109.         WriteClockVk1072C();
  110.         VK1072C_DATA_H();  
  111.         WriteClockVk1072C();

  112.         for( i = 0; i < vk1072C_addrbit; i++)
  113.         {                    
  114.                 if (Addr & Shift)
  115.                         VK1072C_DATA_H();                
  116.                 else  
  117.                         VK1072C_DATA_L();
  118.                 WriteClockVk1072C();               
  119.                 Shift = Shift >> 1;
  120.         }
  121.   Shift = 0x01;
  122.   for (i = 0; i < 4; i++)
  123.         {

  124.                 if( Dat & Shift)
  125.                         VK1072C_DATA_H();                 
  126.            else  
  127.                         VK1072C_DATA_L();
  128.                 WriteClockVk1072C();
  129.                 Shift = Shift << 1;
  130.         }   
  131.   VK1072C_CS_H(); //CS 片选关
  132.         Vk1072C_Delay(VK1072C_CLK/2);       
  133.   VK1072C_DATA_H();
  134. }
  135. /**
  136.   * @brief  Write n data to Vk1072C
  137.   * @param  Addr->写入ram的起始地址
  138.   * @param  Databuf->写入ram的数据buffer
  139.   * @param  Cnt->写入ram的数据个数
  140.   * @retval None
  141.   */
  142. void WritenDataVk1072C(unsigned char Addr,unsigned char *Databuf,unsigned char Cnt)
  143. {
  144.         unsigned char i,j;
  145.         unsigned char Shift;
  146.         unsigned char dataval;
  147.        
  148.         VK1072C_CS_L();   //CS 片选开
  149.         Vk1072C_Delay(VK1072C_CLK/2);

  150.         VK1072C_DATA_H();  
  151.         WriteClockVk1072C();  //101
  152.         VK1072C_DATA_L();  
  153.         WriteClockVk1072C();
  154.         VK1072C_DATA_H();  
  155.         WriteClockVk1072C();

  156.         Shift = 0x20;
  157.         for( i = 0; i < vk1072C_addrbit; i++)
  158.         {                    
  159.                 if (Addr & Shift)
  160.                         VK1072C_DATA_H();                
  161.                 else  
  162.                         VK1072C_DATA_L();
  163.                 WriteClockVk1072C();               
  164.                 Shift = Shift >> 1;
  165.         }
  166.         for (j = 0; j < Cnt; j++)
  167.         {
  168.                 Shift = 0x01;
  169.                 dataval=*Databuf++;
  170.                 for (i = 0; i < 4; i++)
  171.                 {
  172.                         if( dataval & Shift)
  173.                                 VK1072C_DATA_H();                 
  174.                         else  
  175.                                 VK1072C_DATA_L();
  176.                         WriteClockVk1072C();
  177.                         Shift = Shift << 1;
  178.                 }   
  179.         }
  180.   VK1072C_CS_H();   //CS 片选关
  181.         Vk1072C_Delay(VK1072C_CLK/2);         
  182.   VK1072C_DATA_H();
  183. }
  184. /**
  185.   * @brief  lcd全显或全灭
  186.   * @param  state=1->lcd全亮
  187.   * @param  state=0->lcd全灭
  188.   * @retval None
  189.   */
  190. void Vk1072C_DisAll(unsigned char state)
  191. {
  192.         unsigned char segi;
  193.         unsigned char dispram[31];
  194.        
  195.         for(segi=0;segi<VK1072C_SEGNUM;segi++)
  196.         {
  197.                 dispram[segi]=0;
  198.         }
  199.         for(segi=0;segi<VK1072C_SEGNUM;segi++)
  200.         {
  201.                 if(state==1)
  202.                 {
  203.                         if(vk1072C_maxcom==2)
  204.                                 vk1072C_dispram[segi]=0x03;
  205.                         else if(vk1072C_maxcom==3)
  206.                                 vk1072C_dispram[segi]=0x07;
  207.                         else//maxcom==4
  208.                                 vk1072C_dispram[segi]=0x0f;
  209.                 }
  210.                 else
  211.                 {
  212.                         vk1072C_dispram[segi]=0x00;
  213.                 }
  214.                 dispram[vk1072C_segtab[segi]]=vk1072C_dispram[segi];
  215.         }
  216.         WritenDataVk1072C(0,dispram,31);
  217. }
  218. /**
  219.   * @brief  lcd显示单个点(1comx1seg)
  220.   * @param  Seg->点对应的seg
  221.   * @param  Com->点对应的com
  222.   * @retval None
  223.   */
  224. void Vk1072C_DisSegOn(unsigned char Seg,unsigned char Com)
  225. {
  226.         vk1072C_dispram[Seg-vk1072C_segtab[0]]|=(1<<Com);
  227.         Write1DataVk1072C(Seg,vk1072C_dispram[Seg-vk1072C_segtab[0]]);
  228. }
  229. /**
  230.   * @brief  lcd关闭单个点(1comx1seg)
  231.   * @param  None
  232.   * @retval None
  233.   */
  234. void Vk1072C_DisSegOff(unsigned char Seg,unsigned char Com)
  235. {
  236.         vk1072C_dispram[Seg-vk1072C_segtab[0]]&=~(1<<Com);
  237.         Write1DataVk1072C(Seg,vk1072C_dispram[Seg-vk1072C_segtab[0]]);
  238. }
  239. /**
  240.   * @brief  配置Vk1072C通信线GPIO.
  241.   * @param  None
  242.   * @retval None
  243.   */
  244. void Vk1072C_Lowlevel_Init(void)
  245. {
  246.         //通信线电平不同,建议加电平转换电路
  247.         //此函数根据客户单片机做相应的修改
  248.         GPIO_InitTypeDef  GPIO_InitStructure;
  249.        
  250.         /* Enable the Vk1072C GPIO Clock */
  251.         RCC_APB2PeriphClockCmd(VK1072C_CS_GPIO_CLK , ENABLE);
  252.         RCC_APB2PeriphClockCmd(VK1072C_WR_GPIO_CLK , ENABLE);
  253.         RCC_APB2PeriphClockCmd(VK1072C_DAT_GPIO_CLK , ENABLE);

  254.         /* Configure the GPIO pin */
  255.   GPIO_InitStructure.GPIO_Pin = VK1072C_CS_PIN;
  256. //  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//通讯线电平不同,可设为开漏输出,1072C有内部上拉电阻
  257.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //通信线电平一样,可设为推挽输出
  258.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  259.   GPIO_Init(VK1072C_CS_GPIO_PORT, &GPIO_InitStructure);

  260.         /* Configure the GPIO pin */
  261.         GPIO_InitStructure.GPIO_Pin =VK1072C_WR_PIN;       
  262.         GPIO_Init(VK1072C_WR_GPIO_PORT, &GPIO_InitStructure);  

  263.         /* Configure the GPIO pin */
  264.         GPIO_InitStructure.GPIO_Pin =VK1072C_DAT_PIN;       
  265.         GPIO_Init(VK1072C_WR_GPIO_PORT, &GPIO_InitStructure);         
  266. }
  267. /**
  268.   * @brief  Vk1072C进入掉电低功耗模式
  269.   * @param  None
  270.   * @retval None
  271.   */
  272. void Vk1072C_Enter_Standby(void)
  273. {       
  274.         //连续使用命令LCDOFF和SYSDIS,系统将处于掉电低功耗状态。
  275.         //只有使用片内RC时钟源时,才能使系统进入掉电低功耗状态。
  276.         WriteCommandVk1072C(OSC_OFF);
  277.         WriteCommandVk1072C(DISP_OFF);
  278. }
  279. /**
  280.   * @brief  Vk1072C退出掉电低功耗模式
  281.   * @param  None
  282.   * @retval None
  283.   */
  284. void Vk1072C_Exit_Standby(void)
  285. {       
  286.         //退出掉电低功耗状态重新配置vk1072C
  287.         WriteCommandVk1072C(OSC_ON);
  288.         WriteCommandVk1072C(DISP_ON);
  289.         WriteCommandVk1072C(COM_1_3__4);vk1072C_maxcom=4;        //1/3bias 4com
  290. //        WriteCommandVk1072C(COM_1_3__3);vk1072C_maxcom=3;        //1/3bias 3com
  291. //        WriteCommandVk1072C(COM_1_3__2);vk1072C_maxcom=2;        //1/3bias 2com
  292. //        WriteCommandVk1072C(COM_1_2__4);vk1072C_maxcom=4;        //1/2bias 4com
  293. //        WriteCommandVk1072C(COM_1_2__3);vk1072C_maxcom=3;        //1/2bias 3com
  294. //        WriteCommandVk1072C(COM_1_2__2);vk1072C_maxcom=2;        //1/2bias 2com
  295. }
  296. /**
  297.   * @brief  Vk1072C Init
  298.   * @param  None
  299.   * @retval None
  300.   */
  301. void Vk1072C_Init(void)
  302. {       
  303.         //管脚配置根据客户单片机做相应的修改
  304.         Vk1072C_Lowlevel_Init();
  305.         //基本配置
  306.         WriteCommandVk1072C(OSC_ON);
  307.         WriteCommandVk1072C(DISP_ON);
  308.         WriteCommandVk1072C(COM_1_3__4);vk1072C_maxcom=4;        //1/3bias 4com
  309. //        WriteCommandVk1072C(COM_1_3__3);vk1072C_maxcom=3;        //1/3bias 3com
  310. //        WriteCommandVk1072C(COM_1_3__2);vk1072C_maxcom=2;        //1/3bias 2com
  311. //        WriteCommandVk1072C(COM_1_2__4);vk1072C_maxcom=4;        //1/2bias 4com
  312. //        WriteCommandVk1072C(COM_1_2__3);vk1072C_maxcom=3;        //1/2bias 3com
  313. //        WriteCommandVk1072C(COM_1_2__2);vk1072C_maxcom=2;        //1/2bias 2com
  314.         //上电默认配置(以下未用功能关闭降低功耗)
  315.         WriteCommandVk1072C(TIMER_DIS);
  316.         WriteCommandVk1072C(WDT_DIS);
  317.         WriteCommandVk1072C(BUZZ_OFF);
  318.         WriteCommandVk1072C(IRQ_DIS);
  319. }
  320. /**
  321.   * @brief  Vk1072C测试主程序
  322.   * @param  None
  323.   * @retval None
  324.   */
  325. void Vk1072C_Main(void)
  326. {       
  327.         Vk1072C_Init();
  328.         Vk1072C_DisAll(0);
  329.         while(1)
  330.         {
  331.                 Vk1072C_DisAll(1);                                                                                //LCD全显
  332.                 Vk1072C_Delay(50*VK1072C_BASE100MS);        //延时5S
  333.                 Vk1072C_DisAll(0);                                                                                //LCD全关
  334.                 Vk1072C_Delay(50*VK1072C_BASE100MS);        //延时5S
  335.                 for(vk1072C_segi=0;vk1072C_segi<VK1072C_SEGNUM;vk1072C_segi++)//seg
  336.                 {
  337.                         for(vk1072C_comi=0;vk1072C_comi<vk1072C_maxcom;vk1072C_comi++)//com
  338.                         {
  339.                                 Vk1072C_DisSegOn(vk1072C_segtab[vk1072C_segi],vk1072C_comi);        //LCD单个seg点亮
  340.                                 Vk1072C_Delay(3*VK1072C_BASE100MS);                                //延时300mS
  341.                                 Vk1072C_DisAll(0);                                                                //LCD全关
  342.                         }
  343.                 }
  344.                 Vk1072C_DisAll(1);                                                                                //LCD全显
  345.                 Vk1072C_Delay(10*VK1072C_BASE100MS);        //延时1S
  346.                 for(vk1072C_segi=0;vk1072C_segi<VK1072C_SEGNUM;vk1072C_segi++)//seg
  347.                 {
  348.                         for(vk1072C_comi=0;vk1072C_comi<vk1072C_maxcom;vk1072C_comi++)//com
  349.                         {
  350.                                 Vk1072C_DisSegOff(vk1072C_segtab[vk1072C_segi],vk1072C_comi);        //LCD单个seg关闭
  351.                                 Vk1072C_Delay(3*VK1072C_BASE100MS);        //延时300mS
  352.                                 Vk1072C_DisAll(1);                                                                        //LCD全显
  353.                         }
  354.                 }
  355.                 Vk1072C_Delay(10*VK1072C_BASE100MS);//延时1S
  356.                 Vk1072C_DisAll(0);                                                                        //LCD全关
  357.                 Vk1072C_Delay(10*VK1072C_BASE100MS);//延时1S
  358.                 Vk1072C_Enter_Standby();                                                //Vk1072C进入掉电低功耗模式
  359.                 Vk1072C_Delay(50*VK1072C_BASE100MS);//延时5S
  360.                 Vk1072C_Exit_Standby();                                                //Vk1072C退出掉电低功耗模式
  361.         }
  362. }
  363. /************************END OF FILE****/
复制代码
0.png

所有资料51hei提供下载:
vk1072.rar (3.62 KB, 下载次数: 22)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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