鱼C论坛

 找回密码
 立即注册
查看: 3072|回复: 4

[技术交流] mega16 pc串口通信,lcd显示

[复制链接]
发表于 2012-7-8 10:11:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 sky! 于 2012-7-8 10:21 编辑

avr mega16实现上位机异步串口通信..因为我最终要实现控制wifi模块.所以很多规则定义的很奇葩.....
初步实现了串口数据头的识别和显示..下一步就可以用来控制wifi模块了... 20120708103.jpg QQ截图20120708102819.jpg
#include"new_5.h"
#include"new_lcd.h"
#include"new_uart.h"[hide]new_lcd.h
#include"new_5.h"
#define CS_0 PORTC&=~(1<<PC0)
#define CS_1 PORTC|=(1<<PC0)
#define SID_0 PORTC&=~(1<<PC1)
#define SID_1 PORTC|=(1<<PC1)
#define SCLK_0 PORTC&=~(1<<PC2)
#define SCLK_1 PORTC|=(1<<PC2)
#define PSB_0 PORTC&=~(1<<PC3)
#define PSB_1 PORTC|=(1<<PC3)
#define RESET_0 PORTC&=~(1<<PC4)
#define RESET_1 PORTC|=(1<<PC4)
void write(unsigned char start,unsigned char ddata);
void sendbyte(unsigned char bbyte);
void delaynms(unsigned int di);
void lcdinit(void);
/*******************************************/
void lcdinit(void)
{
 delaynms(10);
 PSB_0;
 RESET_0;
 delaynms(1);
 RESET_1;
 CS_1;
 write(0,0x30);
 write(0,0x0c);
 write(0,0x01);
}

void write(uchar start,uchar ddata)
{
 uchar start_data,Hdata,Ldata;
 if(!start) start_data=0xf8;
 else start_data=0xfa;
 
 Hdata=ddata&0xf0;//取高四位
 Ldata=(ddata<<4)&0xf0;//取低四位
 sendbyte(start_data);//发送起始信号
 delaynms(5);//延时是必须的
 sendbyte(Hdata);
 delaynms(1);//延时是必须的
 sendbyte(Ldata);
 delaynms(1);//延时是必须的
}
void sendbyte(uchar bbyte)
{
 uchar i;
 for(i=0;i<8;i++)
 {
  if(bbyte&0x80)
  {
   SID_1;
  }
  else
  {
   SID_0;
  }
  SCLK_1;
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  //cli
  SCLK_0;
  bbyte<<=1;
 }
}

void delaynms(uint di)
{
uchar j;
 while(di--)
 {
  for(j=0;j<1576;j++)          //1ms基准延时程序 
  {
   ;
  } 
 }  
}

void lcdtest(void)
{
 unsigned char i,j;
 for(i=0;i<32;i++)
 {
  write(0,0x80+i);//write(0,0x80);
  for(j=0;j<16;j++) write(1,0xff);
 }
}
/******************************************/

new_uart.h

#include"new_5.h"
#define fosc 11059200
#define baud 115200
char _charget;
void uart_init()
{
        UCSRB=0x00;
        UCSRA=0x00;
        UCSRC=(1<<UCSZ1)|(1<<UCSZ0);//8bit,1停止位,无奇偶校验
        UBRRL=(fosc/16/(baud+1))%256;
        UBRRH=(fosc/16/(baud+1))/256;
        UCSRB=(1<<RXEN)|(1<<TXEN)|BIT(RXCIE);//接收使能,发送使能,接收完成中断使能        
        SREG|=0x80;//全局中断使能
}
void putchar(char c)
{
        while(!(UCSRA&(1<<UDRE)));//检测数据存储器是否为空
        UDR=c;
}
/*uchar getchar()
{
        while(!(UCSRA&(1<<RXC)));//检查接收是否结束
        return UDR;
}*/
void puts(char *s)
{
        while(*s)
        {
                putchar(*s);
                s++;
        }        
}
new_5.h
#ifndef _x_new_
#define _x_new_
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#endif[/hide]

char uart_flag;
char recv_str[50];
uchar uart_i=0;
void main()
{
        
        PORTC=0xff;
        DDRC=0xff;
        lcdinit();
        write(0,0x80);
        uart_init();
        puts("HELLO");
        puts("test ok.");
        while(1)
        {
                if(uart_flag)
                {                        
                        UCSRB&=(~BIT(RXEN));
                        if((recv_str[0]=='O')&&(recv_str[1]=='K'))
                        {
                                
                        }
                        else if((recv_str[0]=='E')&&(recv_str[1]=='R')&&(recv_str[2]=='R'))
                        {
                                write(1,'

);
                                putchar('

);/*test*/
                                recv_str[0]=0x00;
                        }
                        else
                        {
                                uchar i=0;
                                while(recv_str[i])
                                {
                                        write(1,recv_str[i]);
                                        putchar(recv_str[i]);/*test*/
                                        i++;
                                }
                        }
                        UCSRB|=BIT(RXEN);
                        uart_flag=0;
                }
        }
}
#pragma interrupt_handler getchar:12
void getchar()
{
        _charget=UDR;
        
        if(_charget=='+')
        {
                uart_i=0;                
        }
        else if(_charget==0x0d)
        {
                recv_str[uart_i]=0x00;
                uart_flag=1;
        }
        else
        {
                recv_str[uart_i++]=_charget;
        }
        
        
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-8 16:38:53 | 显示全部楼层
{:1_1:}支持一下单片机源码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-8 18:49:12 | 显示全部楼层
好东西                                               
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-9-16 23:42:34 | 显示全部楼层
帮顶一下,期待完整作品。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-5-16 16:15:26 | 显示全部楼层
无回帖,不论坛,这才是人道。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 20:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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