ATMega328でメキシカンハット - とろ☆びっと

ATMega328でメキシカンハット

・せっかく基板に付けたQFP版、使わなきゃ

 ということで久しぶりのメキシカンハット😆

 TEK4010(4014)端末エミュレーションです。

・以前使っていたスケッチが見つからず、アレンジしたら

 ちょっと縦長のハットになりました😅

・手前が自作のCH340KのUSB-TTL変換

 いつものFTDIケーブルはコネクタが故障😭

ソースコード


void setup() {
  // put your setup code here, to run once:
  // シリアルポートを開き、転送速度を9600bpsに設定する。
  Serial.begin(115200);
}
//****************************************************************************
// Tera Term TEK関数
//****************************************************************************
/************** 色の属性を決める *******************/
/* 0:黒 1:赤 2:緑 3:黄 4:青 5:紫 6: 水色 7:白 */
void tekcolor(char color)
{
  Serial.write(0x1b);
  Serial.print("[3");
  Serial.write(color + 0x30);
  Serial.print("m");
}
void Tek_Clr(void)
{
  Serial.write(0x1b); //ESC アルファモードへ戻す
  Serial.write(0x0c); //FF
  Serial.write(0x0d); //CR
  Serial.write(0x0a); //LF
}
/* Dotを打つ 始点・終点を同じ座標にしたLine引き */
void Tek_Dot(int xs,int ys)
{
  unsigned char x0,y0,x1,y1;
  Serial.write(0x1D); //GS
  x0=(unsigned char)(xs&0x1F); //下位5byteを取り出す
  x0=x0|0x40; //Tag-Bitをセット
  y0=(unsigned char)(ys&0x1F); //下位5byteを取り出す
  y0=y0|0x60; //Tag-Bitをセット
  x1=(unsigned char)((xs>>5)&0x1F); //上位byteを5個右シフトしたあと下位5byteを取り出す
  x1=x1|0x20; //Tag-Bitをセット
  y1=(unsigned char)((ys>>5)&0x1F); //上位byteを5個右シフトしたあと下位5byteを取り出す
  y1=y1|0x20; //Tag-Bitをセット
  Serial.write(y1); //座標送信
  Serial.write(y0); //座標送信
  Serial.write(x1); //座標送信
  Serial.write(x0); //座標送信
  Serial.write(y1); //座標送信
  Serial.write(y0); //座標送信
  Serial.write(x1); //座標送信
  Serial.write(x0); //座標送信
Tek_Alpha(); //キャラクタモードに戻す
}
//*************文字描画モード(アルファモード)に戻す*************
void Tek_Alpha(void)
{
   Serial.write(0x1F); //US アルファモードへ戻す
}
//**********グラフィックモードへ切り替え**********
void Tek_Graph(int vector_no)
{
  Serial.write(0x1D); //GS
  Serial.write(0x1B); //ESC 
  Serial.write(vector_no|0x60); //線種を選ぶ
}
/* 直線を引く[xs,ys]→[xg,yg] 座標は左下が[0,0] 幅1023 高さ778まで.
データは10bit+TagBitの構成で全部で8byte送信.
  線種の番号
0:標準実線 1:点線 2:一点鎖線 3:短い鎖線 4:長い鎖線 8:Bold実線
*/
void Tek_Line(int xs,int ys,int xg,int yg,int line_no)
{
  unsigned char x0,y0,x1,y1;
  Tek_Graph(line_no); //グラフィックモードに移行(線種を指定)
  x0=(unsigned char)(xs&0x1F); //下位5byteを取り出す
  x0=x0|0x40; //Tag-Bitをセット
  y0=(unsigned char)(ys&0x1F); //下位5byteを取り出す
  y0=y0|0x60; //Tag-Bitをセット
  x1=(unsigned char)((xs>>5)&0x1F); //上位byteを5個右シフトしたあと下位5byteを取り出す
  x1=x1|0x20; //Tag-Bitをセット
  y1=(unsigned char)((ys>>5)&0x1F); //上位byteを5個右シフトしたあと下位5byteを取り出す
  y1=y1|0x20; //Tag-Bitをセット
  Serial.write(y1); //座標送信
  Serial.write(y0); //座標送信
  Serial.write(x1); //座標送信
  Serial.write(x0); //座標送信
  x0=(unsigned char)(xg&0x1F); //下位5byteを取り出す
  x0=x0|0x40; //Tag-Bitをセット
  y0=(unsigned char)(yg&0x1F); //下位5byteを取り出す
  y0=y0|0x60; //Tag-Bitをセット

  x1=(unsigned char)((xg>>5)&0x1F); //上位byteを5個右シフトしたあと下位5byteを取り出す
  x1=x1|0x20; //Tag-Bitをセット
  y1=(unsigned char)((yg>>5)&0x1F); //上位byteを5個右シフトしたあと下位5byteを取り出す
  y1=y1|0x20; //Tag-Bitをセット
  Serial.write(y1); //座標送信
  Serial.write(y0); //座標送信
  Serial.write(x1); //座標送信
  Serial.write(x0); //座標送信
  Tek_Alpha(); //キャラクタモードに戻す
}
void Tek_Char_PosSet(int xs,int ys)
{
  unsigned char x0,y0,x1,y1;
  Serial.write(0x1D); //GS
  x0=(unsigned char)(xs&0x1F); //下位5byteを取り出す
  x0=x0|0x40; //Tag-Bitをセット
  y0=(unsigned char)(ys&0x1F); //下位5byteを取り出す
  y0=y0|0x60; //Tag-Bitをセット
  x1=(unsigned char)((xs>>5)&0x1F); //上位byteを5個右シフトしたあと下位5byteを取り出す
  x1=x1|0x20; //Tag-Bitをセット
  y1=(unsigned char)((ys>>5)&0x1F); //上位byteを5個右シフトしたあと下位5byteを取り出す
  y1=y1|0x20; //Tag-Bitをセット
  Serial.write(y1); //座標送信
  Serial.write(y0); //座標送信
  Serial.write(x1); //座標送信
  Serial.write(x0); //座標送信
  Tek_Alpha(); //キャラクタモードに戻す
}
//************十字カーソルマークを任意座標中心に表示************
void Tek_Cross_Cursor(int xs,int ys)
{
  int length=10; //カーソルの長さ
  Tek_Line(xs-length/2,ys,xs+length/2,ys,0); //ラインを引く
  Tek_Line(xs,ys-length/2,xs,ys+length/2,0); //ラインを引く
}
//****************************************************************************
// MAINプログラム
//****************************************************************************
void loop() {
  int size_x,size_y;
  float c,r,z,dx,dy,x,y;
  int i,total,no;
  int color1,color2,color3;
  size_x=1023; //Tek-Windowの横サイズ
  size_y=778; //vTek-Windowの縦サイズ

  char count;
  Tek_Clr();
  tekcolor(7);
  total=size_x;
  for(y=-180;y<=180;y=y+4){
    for(x=-180;x<=180;x=x+4){
      c=(float)i/(float)511; //
      r=3.14159/180*sqrt(x*x+y*y);
      z=100*cos(r)-20*cos(3*r);


      z = z*5;
      dx=(int)(462+x/1+(16-y/2)/2);
      dy=(int)((650-y/2+z)/2);
      tekcolor(2);  //Dotの色を変える 緑
      Tek_Dot(dx,dy); //Dotを打つ
    }
  }
  delay(5000);
}