终于又碰到问题了,段码LCD屏?

2019-03-24 20:39发布

关于上次ATMEGA169驱动段码LCD ,感觉除了规格书,没有类似的教程什么的,看了规格书也没看出方法方向,对于新手根本不知道从哪着手,虽然知道是专业的LCD屏驱动(之前直接有用过普通IO口驱动过段码LCD屏数字变化很辛苦),交流驱动应该会比普通IO要方便,但是不知道这个单片机驱动段码LCD屏的方法方式是怎样的,不知道大家最初做的时候是从哪突破的?看各位有做过类似的可否讲讲这款MCU驱动段码LCD的流程该如何? 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
px2noa
1楼-- · 2019-03-27 15:30
//timercount ext_6-2


#include <mega128.h>
#include <stdio.h>
#include <delay.h>
#asm
        .equ __lcd_port=0x15 ;PORTC
    #endasm
#include <lcd.h>

unsigned char TEXT[2][16];
unsigned char hour = 0;
unsigned char min = 0;
unsigned char sec = 0;
unsigned char n = 0;
bit flag = 0;
bit flag_1 = 0;
unsigned char key;

void Display_switch(void)                       
{
        key = PIND & 0x03;
        switch(key){
                   case 0b00000010:
                  
                   delay_ms(150);
                  
                   if(flag_1 == 0)
                   {
                     flag_1 = 1;
                   }
                  
                   else
                    {
                      flag_1 = 0;
                     }
                 
                   break;
                  
                   case 0b00000001:

                   sec = 0;
                   min = 0;
                   hour = 0;
                   n = 0;
                   if(flag_1 == 1)
                    flag = 0;
                   break;
                                 
                   default: break;
                    }
}

--------------------------------------------

void Display_count(void)              
{
    if(sec >= 100){
            sec = 0;
            min++;
            if(min >= 60){
                min = 0;
                hour++;
                 if(hour >=60){
                    hour = 0;
                    n++;
                    if(n > 12){
                    n = 0;
                     }
                  }
              }
     }
}        
void Display_LCD(void)                           
{
    lcd_clear();
   
    sprintf(TEXT[0],"%2d :%2d", n, hour);
    lcd_gotoxy(0,0);
    lcd_puts(TEXT[0]);
        
    sprintf(TEXT[1],":%2d :%2d", min,sec);
    lcd_gotoxy(0,1);
    lcd_puts(TEXT[1]);
}


void main()
{

    DDRC = 0xff;                           
    PORTC =0xff;
    DDRD = 0x00;
   

    TCCR1A = 0x00;
    TCCR1B = 0x0D;
    OCR1A = 156;      
    TIMSK = 0x10;                        
    SREG = 0x80;
            
    lcd_init(16);                          
   
    #asm("sei")                           
  
        
    while(1)
    {  
        Display_switch();
        Display_count();
      
        if(flag == 1){
            flag = 0;
            
        Display_LCD();

        }
     };
}

interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{  
    if(flag_1 == 1){
        sec++;
    }  
    flag = 1;
   
}

一周热门 更多>